rm(list = ls())

Install packages

library(mombf)
library(dplyr)
library(tidyr)
library(ggsci)
library(hdm)
library(glmnet)
library(ggplot2)
library(tidyverse)
library(HDCI)
library(gridExtra)
library(pROC)
library("adapt4pv")
library(readr)
library(dplyr)
library(knitr)
library(kableExtra)
library(stringr)
library(data.table)
library(stringr)
library(readr)
library(tidyverse)

Prep

Load data

# Load data
DIR <- 'data/'
DIR <- '/Users/carlosperezricardo/Downloads/'

raw_train <- read.csv(paste0(DIR,'realestate_train.csv'))
raw_test <- read.csv(paste0(DIR,'realestate_test.csv'))
n_addresses <- 10
dummy_addresses <- T
dummy_subdistricts <- T
dummy_coordinates <- T
qcuts <- 50
drop_prev_prices <- T

log_price <- T
# Filter addresses
address_counts <- raw_train %>% count(address_simple)
selected_addresses <- address_counts[address_counts$n > n_addresses, ]$address_simple

cat('Train size before', dim(raw_train), ': after', dim(raw_train[raw_train$address_simple %in% selected_addresses, ]))
Train size before 23770 478 : after 23432 478
raw_train <- raw_train[raw_train$address_simple %in% selected_addresses, ]

cat('Train size before', dim(raw_test), ': after', dim(raw_test[raw_test$address_simple %in% selected_addresses, ]))
Train size before 3200 478 : after 2941 478
raw_test <- raw_test[raw_test$address_simple %in% selected_addresses, ]

Address dummies

generate_dummies <- function(train, test, column) {
  # Combine train and test
  combined_data <- rbind(train, test)
  
  # Creating dummy variables (assuming 'category' is your categorical column)
  combined_data_dummy <- model.matrix(~ get(column) - 1, combined_data)
  
  col_names <- stringr::str_replace(colnames(combined_data_dummy), "get\\(column\\)", paste0(column, '_'))
  #print(col_names)
  colnames(combined_data_dummy) <- col_names
  
  # Splitting back into training and testing sets
  train_rows <- nrow(train)
  x_train_dummy <- combined_data_dummy[1:train_rows, ]
  x_test_dummy <- combined_data_dummy[(train_rows + 1):nrow(combined_data_dummy), ]
  
  # Add the dummy variables to the original dataframes
  train <- cbind(train, x_train_dummy)
  test <- cbind(test, x_test_dummy)
  
  return(list(train = train, test = test))
}

if (dummy_addresses) {
  result <- generate_dummies(raw_train, raw_test, 'address_simple')
  raw_train <- result$train
  raw_test <- result$test  
}

Subdistrict dummies

obtain_subdistrict <- function(df) {
  df$subdistrict <- sapply(strsplit(df$address_simple, ",\\s*"), function(x) x[[2]])
  df[df$subdistrict == 'Dubai', 'subdistrict'] <- sapply(strsplit(df[df$subdistrict == 'Dubai', 'address_simple'], ",\\s*"), function(x) x[[1]])  
  
  return(df)
}

if (dummy_subdistricts) {
  raw_train <- obtain_subdistrict(raw_train)
  raw_test <- obtain_subdistrict(raw_test)
  
  result <- generate_dummies(raw_train, raw_test, 'subdistrict')
  raw_train <- result$train
  raw_test <- result$test  
}

Coordinates

do_quantiles <- function(data, quantiles, prefix) {
    cuts <- cut(data, quantiles, include.lowest = T)
    cuts <- paste0(prefix, cuts)
    return(cuts)
}
  
combined_data <- rbind(raw_train, raw_test)
# Lat
quantiles <- unique(quantile(combined_data$lat, 0:qcuts/qcuts))
raw_train$lat_cuts <- do_quantiles(raw_train$lat, quantiles, 'lat_')
raw_test$lat_cuts <- do_quantiles(raw_test$lat, quantiles, 'lat_')
  
# Lon
quantiles <- unique(quantile(combined_data$lon, 0:qcuts/qcuts))
raw_train$lon_cuts <- do_quantiles(raw_train$lon, quantiles, 'lon_')
raw_test$lon_cuts <- do_quantiles(raw_test$lon, quantiles, 'lon_')

if (dummy_coordinates) {
  # Lat
  result <- generate_dummies(raw_train, raw_test, 'lat_cuts')
  raw_train <- result$train
  raw_test <- result$test  
  
  # Lon
  result <- generate_dummies(raw_train, raw_test, 'lon_cuts')
  raw_train <- result$train
  raw_test <- result$test  
}
test <- raw_test 
train <-raw_train

# Convert date to numeric
train$date_added <- as.Date(train$date_added)

# Keep numeric columns
numeric <- sapply(train, is.numeric)

train <- train[, numeric]
test <- test[, numeric]

# Remove columns with 0 variance 
test= test[,apply(test, 2, var) > 0] #remove columns with 0 variance
train= train[,apply(train, 2, var) > 0] #remove columns with 0 variance

cat(dim(train), dim(test))
23432 894 2941 877
# To have same columns in train and test
train <- train[, intersect(names(train), names(test))]
test <- test[, intersect(names(train), names(test))]

cat(dim(train), dim(test))
23432 876 2941 876

Remove highly correlated variables

# Check for correlation
correlation_matrix <- cor(train)
high_correlation <- which(abs(correlation_matrix) > 0.99, arr.ind = TRUE)

# Return which variables are getting removex
high_correlation <- high_correlation[high_correlation[, 1] < high_correlation[, 2], ]
pairs_to_remove <- apply(high_correlation, 1, function(index) {
  pair <- colnames(train)[index]
  #cat("High correlation between:", pair[1], "and", pair[2], "\n")
  #cat("Removing:", pair[2], "\n\n")
  return(pair[2])
})

# Remove
test <- test[, !colnames(test) %in% pairs_to_remove]
train <- train[, !colnames(train) %in% pairs_to_remove]

Prepare dataframes

# Split into X and Y for scaling
x_train <- select(train, -price)

num_scale <- 100000 # to make weights more interpretable
y_train_orig <- train$price/num_scale
if (log_price) {
  y_train <- log10(train$price/num_scale)
} else{
  y_train <- train$price/num_scale
}

x_test <- select(test, -price)
y_test_orig <- test$price/num_scale
if (log_price) {
  y_test <- log10(test$price/num_scale)
} else{
  y_test <- test$price/num_scale
}

# Save unscaled
x_train_unscaled <- x_train
x_test_unscaled <- x_test

# Scale 
x_train <- scale(x_train)
x_test <- scale(x_test)

# Create dfs
y_train_df <- data.frame(y_train)
x_train_df <- data.frame(x_train)
colnames(y_train_df)<-'price'

y_test_df <- data.frame(y_test)
x_test_df <- data.frame(x_test)
colnames(y_test_df)<-'price'

# Assuming x_test is your dataframe
if (drop_prev_prices) {
  x_test_df <- x_test_df %>% select(-contains("same"))
  x_train_df <- x_train_df %>% select(-contains("same"))
}

train_df<-cbind(x_train_df,y_train_df)
test_df<-cbind(x_test_df,y_test_df)

Define RMSE

# Regression metrics
rmse <- function(observed, predicted) {
  sqrt(mean((observed - predicted) ^ 2))
}

log_rmse <- function(observed, predicted) {
  sqrt(mean((log(observed) - log(predicted)) ^ 2))
}

mape <- function(observed, predicted) {
  mean(abs((predicted - observed) / observed)) * 100
}

mae <- function(observed, predicted) {
  mean(abs(observed - predicted))
}
colnames(x_train_df)
  [1] "X"                                                                                                                        
  [2] "beds"                                                                                                                     
  [3] "baths"                                                                                                                    
  [4] "area"                                                                                                                     
  [5] "lat"                                                                                                                      
  [6] "lon"                                                                                                                      
  [7] "balcony"                                                                                                                  
  [8] "parking"                                                                                                                  
  [9] "swimming_pool"                                                                                                            
 [10] "furnished"                                                                                                                
 [11] "emirate_n_transactions_shift1m"                                                                                           
 [12] "emirate_avg_trans_value_shift1m"                                                                                          
 [13] "emirate_std_trans_value_shift1m"                                                                                          
 [14] "emirate_offplan_n_transactions_shift1m"                                                                                   
 [15] "emirate_offplan_avg_trans_value_shift1m"                                                                                  
 [16] "emirate_offplan_std_trans_value_shift1m"                                                                                  
 [17] "emirate_ready_n_transactions_shift1m"                                                                                     
 [18] "emirate_ready_avg_trans_value_shift1m"                                                                                    
 [19] "emirate_n_transactions_shift3m"                                                                                           
 [20] "emirate_avg_trans_value_shift3m"                                                                                          
 [21] "emirate_std_trans_value_shift3m"                                                                                          
 [22] "emirate_offplan_n_transactions_shift3m"                                                                                   
 [23] "emirate_offplan_avg_trans_value_shift3m"                                                                                  
 [24] "emirate_offplan_std_trans_value_shift3m"                                                                                  
 [25] "emirate_ready_n_transactions_shift3m"                                                                                     
 [26] "emirate_ready_avg_trans_value_shift3m"                                                                                    
 [27] "emirate_n_transactions_shift6m"                                                                                           
 [28] "emirate_avg_trans_value_shift6m"                                                                                          
 [29] "emirate_std_trans_value_shift6m"                                                                                          
 [30] "emirate_offplan_n_transactions_shift6m"                                                                                   
 [31] "emirate_offplan_avg_trans_value_shift6m"                                                                                  
 [32] "emirate_offplan_std_trans_value_shift6m"                                                                                  
 [33] "emirate_ready_n_transactions_shift6m"                                                                                     
 [34] "emirate_ready_avg_trans_value_shift6m"                                                                                    
 [35] "comm_n_transactions_shift1m"                                                                                              
 [36] "comm_avg_trans_value_shift1m"                                                                                             
 [37] "comm_std_trans_value_shift1m"                                                                                             
 [38] "comm_offplan_n_transactions_shift1m"                                                                                      
 [39] "comm_offplan_avg_trans_value_shift1m"                                                                                     
 [40] "comm_offplan_std_trans_value_shift1m"                                                                                     
 [41] "comm_ready_n_transactions_shift1m"                                                                                        
 [42] "comm_ready_avg_trans_value_shift1m"                                                                                       
 [43] "comm_ready_std_trans_value_shift1m"                                                                                       
 [44] "comm_n_transactions_shift3m"                                                                                              
 [45] "comm_avg_trans_value_shift3m"                                                                                             
 [46] "comm_std_trans_value_shift3m"                                                                                             
 [47] "comm_offplan_n_transactions_shift3m"                                                                                      
 [48] "comm_offplan_avg_trans_value_shift3m"                                                                                     
 [49] "comm_offplan_std_trans_value_shift3m"                                                                                     
 [50] "comm_ready_n_transactions_shift3m"                                                                                        
 [51] "comm_ready_avg_trans_value_shift3m"                                                                                       
 [52] "comm_ready_std_trans_value_shift3m"                                                                                       
 [53] "comm_n_transactions_shift6m"                                                                                              
 [54] "comm_avg_trans_value_shift6m"                                                                                             
 [55] "comm_std_trans_value_shift6m"                                                                                             
 [56] "comm_offplan_n_transactions_shift6m"                                                                                      
 [57] "comm_offplan_avg_trans_value_shift6m"                                                                                     
 [58] "comm_offplan_std_trans_value_shift6m"                                                                                     
 [59] "comm_ready_n_transactions_shift6m"                                                                                        
 [60] "comm_ready_avg_trans_value_shift6m"                                                                                       
 [61] "property_type_Townhouse"                                                                                                  
 [62] "property_type_Villa"                                                                                                      
 [63] "community_Jumeirah.Beach.Residence..JBR."                                                                                 
 [64] "community_Jumeirah.Lake.Towers..JLT."                                                                                     
 [65] "community_Jumeirah.Village.Circle..JVC."                                                                                  
 [66] "completion_status_constructed"                                                                                            
 [67] "completion_status_under.construction"                                                                                     
 [68] "metro_JumeirahLakeTowers"                                                                                                 
 [69] "metro_DubaiMarina"                                                                                                        
 [70] "metro_JumeirahBeachResidence1"                                                                                            
 [71] "metro_Dubai.Marina.Mall"                                                                                                  
 [72] "metro_AirportTerminal"                                                                                                    
 [73] "hospital_EmiratesHospital"                                                                                                
 [74] "hospital_AsterHospital"                                                                                                   
 [75] "market_Waitrose"                                                                                                          
 [76] "market_Carrefour"                                                                                                         
 [77] "market_Safestway"                                                                                                         
 [78] "AED_EUR_price_mean_shift1m"                                                                                               
 [79] "AED_GBP_price_mean_shift1m"                                                                                               
 [80] "AED_RUB_price_mean_shift1m"                                                                                               
 [81] "AED_RUB_price_q75_shift1m"                                                                                                
 [82] "AED_JPY_price_mean_shift1m"                                                                                               
 [83] "AED_CNY_price_mean_shift1m"                                                                                               
 [84] "AED_CAD_price_mean_shift1m"                                                                                               
 [85] "AED_CAD_price_q25_shift1m"                                                                                                
 [86] "AED_CAD_price_q75_shift1m"                                                                                                
 [87] "AED_SAR_price_mean_shift1m"                                                                                               
 [88] "AED_SAR_price_q25_shift1m"                                                                                                
 [89] "AED_SAR_price_q75_shift1m"                                                                                                
 [90] "AED_SAR_price_low_mean_shift1m"                                                                                           
 [91] "AED_CHF_price_mean_shift1m"                                                                                               
 [92] "USD_BTC_price_mean_shift1m"                                                                                               
 [93] "USD_BTC_price_median_shift1m"                                                                                             
 [94] "USD_BTC_price_q25_shift1m"                                                                                                
 [95] "USD_BTC_price_q75_shift1m"                                                                                                
 [96] "USD_BTC_price_high_mean_shift1m"                                                                                          
 [97] "USD_ETH_price_mean_shift1m"                                                                                               
 [98] "USD_ETH_price_median_shift1m"                                                                                             
 [99] "USD_ETH_price_q25_shift1m"                                                                                                
[100] "USD_ETH_price_q75_shift1m"                                                                                                
[101] "USD_ETH_price_high_mean_shift1m"                                                                                          
[102] "SP_500_price_mean_shift1m"                                                                                                
[103] "SP_500_price_q25_shift1m"                                                                                                 
[104] "SP_500_price_q75_shift1m"                                                                                                 
[105] "DINV_price_mean_shift1m"                                                                                                  
[106] "EMAAR_price_mean_shift1m"                                                                                                 
[107] "DEYAAR_price_mean_shift1m"                                                                                                
[108] "AED_EUR_price_mean_shift6m"                                                                                               
[109] "AED_GBP_price_mean_shift6m"                                                                                               
[110] "AED_RUB_price_mean_shift6m"                                                                                               
[111] "AED_RUB_price_median_shift6m"                                                                                             
[112] "AED_RUB_price_q25_shift6m"                                                                                                
[113] "AED_RUB_price_q75_shift6m"                                                                                                
[114] "AED_RUB_price_low_mean_shift6m"                                                                                           
[115] "AED_JPY_price_mean_shift6m"                                                                                               
[116] "AED_CNY_price_mean_shift6m"                                                                                               
[117] "AED_CAD_price_mean_shift6m"                                                                                               
[118] "AED_SAR_price_mean_shift6m"                                                                                               
[119] "AED_SAR_price_median_shift6m"                                                                                             
[120] "AED_SAR_price_q25_shift6m"                                                                                                
[121] "AED_SAR_price_q75_shift6m"                                                                                                
[122] "AED_SAR_price_low_mean_shift6m"                                                                                           
[123] "AED_CHF_price_mean_shift6m"                                                                                               
[124] "AED_CHF_price_q25_shift6m"                                                                                                
[125] "USD_BTC_price_mean_shift6m"                                                                                               
[126] "USD_BTC_price_q25_shift6m"                                                                                                
[127] "USD_BTC_price_q75_shift6m"                                                                                                
[128] "USD_BTC_price_high_mean_shift6m"                                                                                          
[129] "USD_ETH_price_mean_shift6m"                                                                                               
[130] "USD_ETH_price_median_shift6m"                                                                                             
[131] "USD_ETH_price_q25_shift6m"                                                                                                
[132] "USD_ETH_price_q75_shift6m"                                                                                                
[133] "USD_ETH_price_high_mean_shift6m"                                                                                          
[134] "SP_500_price_mean_shift6m"                                                                                                
[135] "DINV_price_mean_shift6m"                                                                                                  
[136] "EMAAR_price_mean_shift6m"                                                                                                 
[137] "DEYAAR_price_mean_shift6m"                                                                                                
[138] "DEYAAR_price_q25_shift6m"                                                                                                 
[139] "DEYAAR_price_q75_shift6m"                                                                                                 
[140] "residential_index_shift1m"                                                                                                
[141] "residential_index_shift3m"                                                                                                
[142] "commercial_index_shift1m"                                                                                                 
[143] "commercial_index_shift3m"                                                                                                 
[144] "general_index_shift1m"                                                                                                    
[145] "housing_water_electricity_gas_other.fuels_shift1m"                                                                        
[146] "general_index_shift6m"                                                                                                    
[147] "housing_water_electricity_gas_other.fuels_shift6m"                                                                        
[148] "gdp_G.20"                                                                                                                 
[149] "gdp_G.7"                                                                                                                  
[150] "gdp_OECD"                                                                                                                 
[151] "gdp_USA"                                                                                                                  
[152] "gdp_construction_cost.index"                                                                                              
[153] "gdp_construction_non.residential"                                                                                         
[154] "gdp_construction"                                                                                                         
[155] "gdp_mining_quarrying"                                                                                                     
[156] "gdp_real_estate_activities"                                                                                               
[157] "gold_price_shift1m"                                                                                                       
[158] "gold_price_change_shift1m"                                                                                                
[159] "petrol_price_shift1m"                                                                                                     
[160] "petrol_price_change_shift1m"                                                                                              
[161] "diesel_price_shift1m"                                                                                                     
[162] "diesel_price_change_shift1m"                                                                                              
[163] "gasoline_price_shift1m"                                                                                                   
[164] "gasoline_price_change_shift1m"                                                                                            
[165] "gold_price_shift3m"                                                                                                       
[166] "gold_price_change_shift3m"                                                                                                
[167] "petrol_price_shift3m"                                                                                                     
[168] "petrol_price_change_shift3m"                                                                                              
[169] "diesel_price_shift3m"                                                                                                     
[170] "diesel_price_change_shift3m"                                                                                              
[171] "gasoline_price_shift3m"                                                                                                   
[172] "gasoline_price_change_shift3m"                                                                                            
[173] "address_simple_23.Marina..Dubai.Marina..Dubai"                                                                            
[174] "address_simple_5242.Towers..Dubai.Marina..Dubai"                                                                          
[175] "address_simple_ACES.Chateau..JVC.District.11..Jumeirah.Village.Circle..JVC...Dubai"                                       
[176] "address_simple_Al.Anbar.Tower..Dubai.Marina.Towers..Emaar.6.Towers...Dubai.Marina..Dubai"                                 
[177] "address_simple_Al.Bateen.Towers..The.Walk..Jumeirah.Beach.Residence..JBR...Dubai"                                         
[178] "address_simple_Al.Dana.Tower..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                                      
[179] "address_simple_Al.Fattan.Marine.Towers..Jumeirah.Beach.Residence..JBR...Dubai"                                            
[180] "address_simple_Al.Majara..Al.Majara..Dubai.Marina..Dubai"                                                                 
[181] "address_simple_Al.Mesk.Tower..Dubai.Marina.Towers..Emaar.6.Towers...Dubai.Marina..Dubai"                                  
[182] "address_simple_Al.Murjan.Tower..Dubai.Marina.Towers..Emaar.6.Towers...Dubai.Marina..Dubai"                                
[183] "address_simple_Al.Sahab.Tower..Al.Sahab.Tower..Dubai.Marina..Dubai"                                                       
[184] "address_simple_Al.Seef.Tower..JLT.Cluster.U..Jumeirah.Lake.Towers..JLT...Dubai"                                           
[185] "address_simple_Al.Shera.Tower..JLT.Cluster.E..Jumeirah.Lake.Towers..JLT...Dubai"                                          
[186] "address_simple_Al.Waleed.Paradise..JLT.Cluster.R..Jumeirah.Lake.Towers..JLT...Dubai"                                      
[187] "address_simple_ALCOVE..JVC.District.11..Jumeirah.Village.Circle..JVC...Dubai"                                             
[188] "address_simple_Amwaj..Amwaj..Jumeirah.Beach.Residence..JBR...Dubai"                                                       
[189] "address_simple_Arezzo..Tuscan.Residence..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                           
[190] "address_simple_Aria.Residence..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                     
[191] "address_simple_Armada.Tower..Armada.Towers..JLT.Cluster.P..Jumeirah.Lake.Towers..JLT...Dubai"                             
[192] "address_simple_Astoria.Residence..JVC.District.11..Jumeirah.Village.Circle..JVC...Dubai"                                  
[193] "address_simple_Attessa..Marina.Promenade..Dubai.Marina..Dubai"                                                            
[194] "address_simple_Aurora..Marina.Promenade..Dubai.Marina..Dubai"                                                             
[195] "address_simple_Autumn..Seasons.Community..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                          
[196] "address_simple_Avanos.Residence..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                   
[197] "address_simple_Azure..Dubai.Marina..Dubai"                                                                                
[198] "address_simple_Bahar..Bahar..Jumeirah.Beach.Residence..JBR...Dubai"                                                       
[199] "address_simple_Banyan.Tree.Residences..Jumeirah.Lake.Towers..JLT...Dubai"                                                 
[200] "address_simple_Bay.Central..Central.Tower...Bay.Central..Dubai.Marina..Dubai"                                             
[201] "address_simple_Bay.Central..Bay.Central..Dubai.Marina..Dubai"                                                             
[202] "address_simple_Bay.Central..Dubai.Marina..Dubai"                                                                          
[203] "address_simple_Beauport..Marina.Promenade..Dubai.Marina..Dubai"                                                           
[204] "address_simple_Belgravia.Heights..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                                  
[205] "address_simple_Belgravia.Square..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                   
[206] "address_simple_Belgravia..Belgravia..JVC.District.11..Jumeirah.Village.Circle..JVC...Dubai"                               
[207] "address_simple_Belgravia..JVC.District.11..Jumeirah.Village.Circle..JVC...Dubai"                                          
[208] "address_simple_Belgravia..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                          
[209] "address_simple_Beverly.Residence..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                  
[210] "address_simple_Binghatti.Gate..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                                     
[211] "address_simple_Binghatti.Gems..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                                     
[212] "address_simple_Binghatti.Heights..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                  
[213] "address_simple_Binghatti.Jasmine..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                                  
[214] "address_simple_Binghatti.Mirage..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                   
[215] "address_simple_Binghatti.Rose..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                                     
[216] "address_simple_Blakely.Tower..Park.Island..Dubai.Marina..Dubai"                                                           
[217] "address_simple_Bloom.Heights..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                                      
[218] "address_simple_Bloom.Towers..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                       
[219] "address_simple_Bonaire.Tower..Park.Island..Dubai.Marina..Dubai"                                                           
[220] "address_simple_Bonnington.Tower..JLT.Cluster.J..Jumeirah.Lake.Towers..JLT...Dubai"                                        
[221] "address_simple_Botanica.Tower..Dubai.Marina..Dubai"                                                                       
[222] "address_simple_Botanica..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                           
[223] "address_simple_Cappadocia..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                         
[224] "address_simple_Catch.Residences..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                                   
[225] "address_simple_Cayan.Tower..Dubai.Marina..Dubai"                                                                          
[226] "address_simple_Chaimaa.Avenue.Residences..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                          
[227] "address_simple_Chaimaa.Premiere..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                                   
[228] "address_simple_Ciel.Tower..Dubai.Marina..Dubai"                                                                           
[229] "address_simple_City.Apartments..JVC.District.11..Jumeirah.Village.Circle..JVC...Dubai"                                    
[230] "address_simple_Concorde.Tower..JLT.Cluster.H..Jumeirah.Lake.Towers..JLT...Dubai"                                          
[231] "address_simple_Continental.Tower..Dubai.Marina..Dubai"                                                                    
[232] "address_simple_Crystal.Residence..JVC.District.11..Jumeirah.Village.Circle..JVC...Dubai"                                  
[233] "address_simple_DAMAC.Ghalia..JVC.District.18..Jumeirah.Village.Circle..JVC...Dubai"                                       
[234] "address_simple_Damac.Heights..Dubai.Marina..Dubai"                                                                        
[235] "address_simple_Dar.Al.Jawhara.Residence..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                           
[236] "address_simple_DEC.Tower..DEC.Towers..Dubai.Marina..Dubai"                                                                
[237] "address_simple_DEC.Towers..Dubai.Marina..Dubai"                                                                           
[238] "address_simple_Diamond.Views..Diamond.Views..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                       
[239] "address_simple_Dorra.Bay..Dubai.Marina..Dubai"                                                                            
[240] "address_simple_Dream.Tower..Dream.Towers..Dubai.Marina..Dubai"                                                            
[241] "address_simple_Dream.Towers..Dubai.Marina..Dubai"                                                                         
[242] "address_simple_Dubai.Arch.Tower..JLT.Cluster.G..Jumeirah.Lake.Towers..JLT...Dubai"                                        
[243] "address_simple_Dubai.Marina..Dubai"                                                                                       
[244] "address_simple_Dubai.Star.Tower..JLT.Cluster.L..Jumeirah.Lake.Towers..JLT...Dubai"                                        
[245] "address_simple_Dusit.Princess.Rijas..JVC.District.18..Jumeirah.Village.Circle..JVC...Dubai"                               
[246] "address_simple_Eaton.Place..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                                        
[247] "address_simple_Elite.Residence..Dubai.Marina..Dubai"                                                                      
[248] "address_simple_Emirates.Gardens..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                                   
[249] "address_simple_Escan.Marina.Tower..Dubai.Marina..Dubai"                                                                   
[250] "address_simple_Fairfield.Tower..Park.Island..Dubai.Marina..Dubai"                                                         
[251] "address_simple_FIVE.Jumeirah.Village..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                              
[252] "address_simple_Florence..Tuscan.Residence..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                         
[253] "address_simple_Fortunato..JVC.District.11..Jumeirah.Village.Circle..JVC...Dubai"                                          
[254] "address_simple_Gardenia.Residency..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                                 
[255] "address_simple_Gardenia..Emirates.Gardens..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                         
[256] "address_simple_Global.Lake.View..JLT.Cluster.E..Jumeirah.Lake.Towers..JLT...Dubai"                                        
[257] "address_simple_Goldcrest.Executive..JLT.Cluster.C..Jumeirah.Lake.Towers..JLT...Dubai"                                     
[258] "address_simple_Goldcrest.Views..JLT.Cluster.J..Jumeirah.Lake.Towers..JLT...Dubai"                                         
[259] "address_simple_Goldcrest.Views..JLT.Cluster.V..Jumeirah.Lake.Towers..JLT...Dubai"                                         
[260] "address_simple_Green.Lakes..JLT.Cluster.S..Green.Lake.Towers...Jumeirah.Lake.Towers..JLT...Dubai"                         
[261] "address_simple_Hanover.Square..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                     
[262] "address_simple_Harrington.House..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                   
[263] "address_simple_Haven.Villas..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                       
[264] "address_simple_Hyati.Avenue..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                       
[265] "address_simple_Hyati.Residences..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                   
[266] "address_simple_Icon.Tower..JLT.Cluster.L..Jumeirah.Lake.Towers..JLT...Dubai"                                              
[267] "address_simple_Icon.Tower..JLT.Cluster.M..Jumeirah.Lake.Towers..JLT...Dubai"                                              
[268] "address_simple_Indigo.Tower..JLT.Cluster.D..Jumeirah.Lake.Towers..JLT...Dubai"                                            
[269] "address_simple_Iris.Blue..Dubai.Marina..Dubai"                                                                            
[270] "address_simple_Joya.Verde.Residences..JVC.District.11..Jumeirah.Village.Circle..JVC...Dubai"                              
[271] "address_simple_Jumeirah.Bay.X1..JLT.Cluster.X..Jumeirah.Bay.Towers...Jumeirah.Lake.Towers..JLT...Dubai"                   
[272] "address_simple_Jumeirah.Beach.Residence..JBR...Dubai"                                                                     
[273] "address_simple_Jumeirah.Gate.Tower..The.Address.Residences.Jumeirah.Resort.and.Spa..Jumeirah.Beach.Residence..JBR...Dubai"
[274] "address_simple_Jumeirah.Lake.Towers..JLT...Dubai"                                                                         
[275] "address_simple_Jumeirah.Living.Marina.Gate..Marina.Gate..Dubai.Marina..Dubai"                                             
[276] "address_simple_Jumeirah.Village.Circle..JVC...Dubai"                                                                      
[277] "address_simple_JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                                     
[278] "address_simple_JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                                                     
[279] "address_simple_Kensington.Manor..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                   
[280] "address_simple_KG.Tower..Dubai.Marina..Dubai"                                                                             
[281] "address_simple_Knightsbridge.Court..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                
[282] "address_simple_La.Riviera.Apartments..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                              
[283] "address_simple_La.Riviera.Azure..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                   
[284] "address_simple_La.Riviera.Estate..La.Riviera.Estates..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"              
[285] "address_simple_La.Riviera.Estates..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                 
[286] "address_simple_La.Riviera..Dubai.Marina..Dubai"                                                                           
[287] "address_simple_La.Vie..Jumeirah.Beach.Residence..JBR...Dubai"                                                             
[288] "address_simple_Laguna.Tower..JLT.Cluster.A..Jumeirah.Lake.Towers..JLT...Dubai"                                            
[289] "address_simple_Lake.City.Tower..JLT.Cluster.D..Jumeirah.Lake.Towers..JLT...Dubai"                                         
[290] "address_simple_Lake.Point.Tower..JLT.Cluster.N..Jumeirah.Lake.Towers..JLT...Dubai"                                        
[291] "address_simple_Lake.Shore.Tower..JLT.Cluster.Y..Jumeirah.Lake.Towers..JLT...Dubai"                                        
[292] "address_simple_Lake.Terrace..JLT.Cluster.D..Jumeirah.Lake.Towers..JLT...Dubai"                                            
[293] "address_simple_Lake.View.Tower..JLT.Cluster.B..Jumeirah.Lake.Towers..JLT...Dubai"                                         
[294] "address_simple_Lakeside.Residence..JLT.Cluster.A..Jumeirah.Lake.Towers..JLT...Dubai"                                      
[295] "address_simple_Lavender..Emirates.Gardens..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                         
[296] "address_simple_Laya.Mansion..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                                       
[297] "address_simple_Laya.Residences..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                    
[298] "address_simple_Le.Grand.Chateau..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                   
[299] "address_simple_Le.Grand.Chateau..Le.Grand.Chateau..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                 
[300] "address_simple_LIV.Marina..Dubai.Marina..Dubai"                                                                           
[301] "address_simple_LIV.Residence..Dubai.Marina..Dubai"                                                                        
[302] "address_simple_Living.Garden..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                      
[303] "address_simple_LOCI.Residences..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                    
[304] "address_simple_Lolena.Residence..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                                   
[305] "address_simple_Lucky.Residences..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                   
[306] "address_simple_Luma21..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                             
[307] "address_simple_Madina.Tower..JLT.Cluster.O..Jumeirah.Lake.Towers..JLT...Dubai"                                            
[308] "address_simple_Mag.218.Tower..Dubai.Marina..Dubai"                                                                        
[309] "address_simple_Mag.Tower..JLT.Cluster.R..Jumeirah.Lake.Towers..JLT...Dubai"                                               
[310] "address_simple_Magnolia..Emirates.Gardens.2..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                       
[311] "address_simple_Manchester.Tower..Dubai.Marina..Dubai"                                                                     
[312] "address_simple_Maple..Emirates.Gardens.2..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                          
[313] "address_simple_Marina.Arcade.Tower..Dubai.Marina..Dubai"                                                                  
[314] "address_simple_Marina.Crown..Dubai.Marina..Dubai"                                                                         
[315] "address_simple_Marina.Diamond..Marina.Diamonds..Dubai.Marina..Dubai"                                                      
[316] "address_simple_Marina.Gate..Marina.Gate..Dubai.Marina..Dubai"                                                             
[317] "address_simple_Marina.Heights.Tower..Dubai.Marina..Dubai"                                                                 
[318] "address_simple_Marina.Opal.Tower..Dubai.Marina..Dubai"                                                                    
[319] "address_simple_Marina.Pearl..Dubai.Marina..Dubai"                                                                         
[320] "address_simple_Marina.Pinnacle..Dubai.Marina..Dubai"                                                                      
[321] "address_simple_Marina.Quays..Marina.Quays..Dubai.Marina..Dubai"                                                           
[322] "address_simple_Marina.Residence..Marina.Residence..Dubai.Marina..Dubai"                                                   
[323] "address_simple_Marina.Terrace..Dubai.Marina..Dubai"                                                                       
[324] "address_simple_Marina.Tower..Dubai.Marina..Dubai"                                                                         
[325] "address_simple_Marina.View.Tower..Marina.View.Tower..Dubai.Marina..Dubai"                                                 
[326] "address_simple_Marina.Wharf..Marina.Wharf..Dubai.Marina..Dubai"                                                           
[327] "address_simple_Marwa.Heights..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                      
[328] "address_simple_Masaar.Residence..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                                   
[329] "address_simple_MBL.Residences..JLT.Cluster.K..Jumeirah.Lake.Towers..JLT...Dubai"                                          
[330] "address_simple_MBL.Royal..JLT.Cluster.K..Jumeirah.Lake.Towers..JLT...Dubai"                                               
[331] "address_simple_MILANO.by.Giovanni.Boutique.Suites..JVC.District.17..Jumeirah.Village.Circle..JVC...Dubai"                 
[332] "address_simple_Mulberry..Emirates.Gardens.2..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                       
[333] "address_simple_Murjan..Murjan..Jumeirah.Beach.Residence..JBR...Dubai"                                                     
[334] "address_simple_New.Dubai.Gate..JLT.Cluster.A..Jumeirah.Lake.Towers..JLT...Dubai"                                          
[335] "address_simple_New.Dubai.Gate..JLT.Cluster.Q..Jumeirah.Lake.Towers..JLT...Dubai"                                          
[336] "address_simple_No..9..Dubai.Marina..Dubai"                                                                                
[337] "address_simple_Noora.Residence..Noora.Residence..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                   
[338] "address_simple_O2.Residence..JLT.Cluster.O..Jumeirah.Lake.Towers..JLT...Dubai"                                            
[339] "address_simple_O2.Tower..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                           
[340] "address_simple_Ocean.Heights..Dubai.Marina..Dubai"                                                                        
[341] "address_simple_Orchidea.Residence..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                 
[342] "address_simple_Orra.Marina..Dubai.Marina..Dubai"                                                                          
[343] "address_simple_Oxford.Boulevard..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                                   
[344] "address_simple_Oxford.Residence..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                   
[345] "address_simple_Oxford.Residence..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                   
[346] "address_simple_Oxford..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                             
[347] "address_simple_Paloma..Marina.Promenade..Dubai.Marina..Dubai"                                                             
[348] "address_simple_Pantheon.Boulevard..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                 
[349] "address_simple_Pantheon.Elysee..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                                    
[350] "address_simple_Pantheon.Elysee..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                    
[351] "address_simple_Pantheon.Elysee..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                                    
[352] "address_simple_Park.View.Tower..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                    
[353] "address_simple_Park.Vista..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                         
[354] "address_simple_Plaza.Residences..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                   
[355] "address_simple_Plazzo.Heights..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                     
[356] "address_simple_Princess.Tower..Dubai.Marina..Dubai"                                                                       
[357] "address_simple_Pulse.Smart.Residence..JVC.District.11..Jumeirah.Village.Circle..JVC...Dubai"                              
[358] "address_simple_Reef.Residence..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                     
[359] "address_simple_Regina.Tower..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                                       
[360] "address_simple_Rigel.Apartments..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                   
[361] "address_simple_Rimal..Rimal..Jumeirah.Beach.Residence..JBR...Dubai"                                                       
[362] "address_simple_Rose..Emirates.Gardens..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                             
[363] "address_simple_Roxana.Residence..Roxana.Residences..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                
[364] "address_simple_Roxana.Residences..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                                  
[365] "address_simple_Saba.Tower..JLT.Cluster.Q..Jumeirah.Lake.Towers..JLT...Dubai"                                              
[366] "address_simple_Sadaf..Sadaf..Jumeirah.Beach.Residence..JBR...Dubai"                                                       
[367] "address_simple_Samana.Waves..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                       
[368] "address_simple_Sandoval.Garden..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                    
[369] "address_simple_Sanibel.Tower..Park.Island..Dubai.Marina..Dubai"                                                           
[370] "address_simple_Se7en.City..Jumeirah.Lake.Towers..JLT...Dubai"                                                             
[371] "address_simple_Seasons.Community..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                                  
[372] "address_simple_Serenity.Lakes..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                     
[373] "address_simple_Shamal.Residences..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                  
[374] "address_simple_Shamal.Residences..Shamal.Residences..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"               
[375] "address_simple_Shamal.Waves..JVC.District.14..Jumeirah.Village.Circle..JVC...Dubai"                                       
[376] "address_simple_Shams..Shams..Jumeirah.Beach.Residence..JBR...Dubai"                                                       
[377] "address_simple_Shemara..Marina.Promenade..Dubai.Marina..Dubai"                                                            
[378] "address_simple_Siena..Tuscan.Residence..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                            
[379] "address_simple_Signature.Livings..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                  
[380] "address_simple_Silverene.Tower..Silverene..Dubai.Marina..Dubai"                                                           
[381] "address_simple_Skyview.Tower..Dubai.Marina..Dubai"                                                                        
[382] "address_simple_Sobha.Daffodil..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                     
[383] "address_simple_Sparkle.Tower..Sparkle.Towers..Dubai.Marina..Dubai"                                                        
[384] "address_simple_Sparkle.Towers..Dubai.Marina..Dubai"                                                                       
[385] "address_simple_Spica.Residential..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                  
[386] "address_simple_Stella.Maris..Dubai.Marina..Dubai"                                                                         
[387] "address_simple_Studio.One.Tower..Dubai.Marina..Dubai"                                                                     
[388] "address_simple_Sulafa.Tower..Dubai.Marina..Dubai"                                                                         
[389] "address_simple_Summer..Seasons.Community..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                          
[390] "address_simple_TFG.Marina.Hotel..Dubai.Marina..Dubai"                                                                     
[391] "address_simple_The.Address.Dubai.Marina..Mall.Hotel...Dubai.Marina..Dubai"                                                
[392] "address_simple_The.Address.Residences.Jumeirah.Resort.and.Spa..Jumeirah.Beach.Residence..JBR...Dubai"                     
[393] "address_simple_The.Belvedere..Dubai.Marina..Dubai"                                                                        
[394] "address_simple_The.Jewel.Tower..The.Jewels..Dubai.Marina..Dubai"                                                          
[395] "address_simple_The.Manhattan..JVC.District.10..Jumeirah.Village.Circle..JVC...Dubai"                                      
[396] "address_simple_The.Palladium..JLT.Cluster.C..Jumeirah.Lake.Towers..JLT...Dubai"                                           
[397] "address_simple_The.Plaza.Residences..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                               
[398] "address_simple_The.Point..Dubai.Marina..Dubai"                                                                            
[399] "address_simple_The.Portman..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                                        
[400] "address_simple_The.Royal.Oceanic..Dubai.Marina..Dubai"                                                                    
[401] "address_simple_The.Sloane..JVC.District.12..Jumeirah.Village.Circle..JVC...Dubai"                                         
[402] "address_simple_The.Square.Tower..JVC.District.13..Jumeirah.Village.Circle..JVC...Dubai"                                   
[403] "address_simple_The.Torch..Dubai.Marina..Dubai"                                                                            
[404] "address_simple_The.Waves.Tower..The.Waves..Dubai.Marina..Dubai"                                                           
[405] "address_simple_The.Zen..Dubai.Marina..Dubai"                                                                              
[406] "address_simple_Time.Place..Dubai.Marina..Dubai"                                                                           
[407] "address_simple_Tower..JVC.District.18..Jumeirah.Village.Circle..JVC...Dubai"                                              
[408] "address_simple_Trident.Bayside..Dubai.Marina..Dubai"                                                                      
[409] "address_simple_Trident.Grand.Residence..Dubai.Marina..Dubai"                                                              
[410] "address_simple_Trident.Marinascape.Avant.Tower..Marinascape..Dubai.Marina..Dubai"                                         
[411] "address_simple_V3.Tower..JLT.Cluster.V..Jumeirah.Lake.Towers..JLT...Dubai"                                                
[412] "address_simple_Vida.Residences.Dubai.Marina..Dubai.Marina..Dubai"                                                         
[413] "address_simple_West.Avenue..Dubai.Marina..Dubai"                                                                          
[414] "address_simple_Wind.Tower..Wind.Towers..Jumeirah.Lake.Towers..JLT...Dubai"                                                
[415] "address_simple_Yacht.Bay..Dubai.Marina..Dubai"                                                                            
[416] "address_simple_Zaya.Hameni..JVC.District.15..Jumeirah.Village.Circle..JVC...Dubai"                                        
[417] "address_simple_Zumurud.Tower..Dubai.Marina..Dubai"                                                                        
[418] "subdistrict_Bay.Central"                                                                                                  
[419] "subdistrict_Dubai.Marina"                                                                                                 
[420] "subdistrict_Dubai.Marina.Towers..Emaar.6.Towers."                                                                         
[421] "subdistrict_Emirates.Gardens"                                                                                             
[422] "subdistrict_Emirates.Gardens.2"                                                                                           
[423] "subdistrict_JLT.Cluster.A"                                                                                                
[424] "subdistrict_JLT.Cluster.C"                                                                                                
[425] "subdistrict_JLT.Cluster.D"                                                                                                
[426] "subdistrict_JLT.Cluster.E"                                                                                                
[427] "subdistrict_JLT.Cluster.J"                                                                                                
[428] "subdistrict_JLT.Cluster.K"                                                                                                
[429] "subdistrict_JLT.Cluster.L"                                                                                                
[430] "subdistrict_JLT.Cluster.O"                                                                                                
[431] "subdistrict_JLT.Cluster.Q"                                                                                                
[432] "subdistrict_JLT.Cluster.R"                                                                                                
[433] "subdistrict_JLT.Cluster.V"                                                                                                
[434] "subdistrict_Jumeirah.Beach.Residence..JBR."                                                                               
[435] "subdistrict_Jumeirah.Lake.Towers..JLT."                                                                                   
[436] "subdistrict_Jumeirah.Village.Circle..JVC."                                                                                
[437] "subdistrict_JVC.District.10"                                                                                              
[438] "subdistrict_JVC.District.11"                                                                                              
[439] "subdistrict_JVC.District.12"                                                                                              
[440] "subdistrict_JVC.District.13"                                                                                              
[441] "subdistrict_JVC.District.14"                                                                                              
[442] "subdistrict_JVC.District.15"                                                                                              
[443] "subdistrict_JVC.District.18"                                                                                              
[444] "subdistrict_Marina.Gate"                                                                                                  
[445] "subdistrict_Marina.Promenade"                                                                                             
[446] "subdistrict_Park.Island"                                                                                                  
[447] "subdistrict_Seasons.Community"                                                                                            
[448] "subdistrict_Tuscan.Residence"                                                                                             
[449] "lat_cuts_lat_.25.04733.25.04859."                                                                                         
[450] "lat_cuts_lat_.25.04859.25.05027."                                                                                         
[451] "lat_cuts_lat_.25.05027.25.05093."                                                                                         
[452] "lat_cuts_lat_.25.05093.25.05201."                                                                                         
[453] "lat_cuts_lat_.25.05201.25.05356."                                                                                         
[454] "lat_cuts_lat_.25.05356.25.05443."                                                                                         
[455] "lat_cuts_lat_.25.05443.25.05613."                                                                                         
[456] "lat_cuts_lat_.25.05613.25.05639."                                                                                         
[457] "lat_cuts_lat_.25.05639.25.05731."                                                                                         
[458] "lat_cuts_lat_.25.05731.25.05836."                                                                                         
[459] "lat_cuts_lat_.25.05836.25.05983."                                                                                         
[460] "lat_cuts_lat_.25.05983.25.06259."                                                                                         
[461] "lat_cuts_lat_.25.06259.25.06321."                                                                                         
[462] "lat_cuts_lat_.25.06321.25.06367."                                                                                         
[463] "lat_cuts_lat_.25.06367.25.06551."                                                                                         
[464] "lat_cuts_lat_.25.06551.25.06645."                                                                                         
[465] "lat_cuts_lat_.25.06645.25.06707."                                                                                         
[466] "lat_cuts_lat_.25.0671.25.06769."                                                                                          
[467] "lat_cuts_lat_.25.06769.25.06831."                                                                                         
[468] "lat_cuts_lat_.25.06831.25.06853."                                                                                         
[469] "lat_cuts_lat_.25.06853.25.06995."                                                                                         
[470] "lat_cuts_lat_.25.06995.25.07077."                                                                                         
[471] "lat_cuts_lat_.25.07077.25.07104."                                                                                         
[472] "lat_cuts_lat_.25.07104.25.07147."                                                                                         
[473] "lat_cuts_lat_.25.07147.25.07222."                                                                                         
[474] "lat_cuts_lat_.25.07222.25.07224."                                                                                         
[475] "lat_cuts_lat_.25.07224.25.07238."                                                                                         
[476] "lat_cuts_lat_.25.07238.25.0729."                                                                                          
[477] "lat_cuts_lat_.25.0729.25.07433."                                                                                          
[478] "lat_cuts_lat_.25.07433.25.0753."                                                                                          
[479] "lat_cuts_lat_.25.0753.25.07628."                                                                                          
[480] "lat_cuts_lat_.25.07628.25.07651."                                                                                         
[481] "lat_cuts_lat_.25.07651.25.07744."                                                                                         
[482] "lat_cuts_lat_.25.07744.25.07829."                                                                                         
[483] "lat_cuts_lat_.25.07829.25.07914."                                                                                         
[484] "lat_cuts_lat_.25.07914.25.07982."                                                                                         
[485] "lat_cuts_lat_.25.07982.25.08039."                                                                                         
[486] "lat_cuts_lat_.25.08039.25.08139."                                                                                         
[487] "lat_cuts_lat_.25.08139.25.08209."                                                                                         
[488] "lat_cuts_lat_.25.08209.25.08345."                                                                                         
[489] "lat_cuts_lat_.25.08345.25.08515."                                                                                         
[490] "lat_cuts_lat_.25.08515.25.08644."                                                                                         
[491] "lat_cuts_lat_.25.08652.25.08721."                                                                                         
[492] "lat_cuts_lat_.25.08721.25.0884."                                                                                          
[493] "lat_cuts_lat_.25.0887.25.08962."                                                                                          
[494] "lat_cuts_lat_.25.08962.25.09068."                                                                                         
[495] "lat_cuts_lat_.24.49206.25.04733."                                                                                         
[496] "lon_cuts_lon_.55.12635.55.12642."                                                                                         
[497] "lon_cuts_lon_.55.12642.55.1289."                                                                                          
[498] "lon_cuts_lon_.55.1289.55.12925."                                                                                          
[499] "lon_cuts_lon_.55.12925.55.1318."                                                                                          
[500] "lon_cuts_lon_.55.1318.55.13244."                                                                                          
[501] "lon_cuts_lon_.55.13244.55.13343."                                                                                         
[502] "lon_cuts_lon_.55.13343.55.1343."                                                                                          
[503] "lon_cuts_lon_.55.1343.55.13566."                                                                                          
[504] "lon_cuts_lon_.55.13566.55.13625."                                                                                         
[505] "lon_cuts_lon_.55.13625.55.13707."                                                                                         
[506] "lon_cuts_lon_.55.13707.55.13786."                                                                                         
[507] "lon_cuts_lon_.55.13786.55.13829."                                                                                         
[508] "lon_cuts_lon_.55.13829.55.13888."                                                                                         
[509] "lon_cuts_lon_.55.13888.55.13976."                                                                                         
[510] "lon_cuts_lon_.55.13976.55.14027."                                                                                         
[511] "lon_cuts_lon_.55.14027.55.1412."                                                                                          
[512] "lon_cuts_lon_.55.1412.55.14185."                                                                                          
[513] "lon_cuts_lon_.55.14185.55.1425."                                                                                          
[514] "lon_cuts_lon_.55.1425.55.1445."                                                                                           
[515] "lon_cuts_lon_.55.1445.55.14481."                                                                                          
[516] "lon_cuts_lon_.55.14481.55.14534."                                                                                         
[517] "lon_cuts_lon_.55.14534.55.14582."                                                                                         
[518] "lon_cuts_lon_.55.14582.55.147."                                                                                           
[519] "lon_cuts_lon_.55.14736.55.14748."                                                                                         
[520] "lon_cuts_lon_.55.14748.55.14828."                                                                                         
[521] "lon_cuts_lon_.55.14828.55.1491."                                                                                          
[522] "lon_cuts_lon_.55.14986.55.15396."                                                                                         
[523] "lon_cuts_lon_.55.15396.55.1979."                                                                                          
[524] "lon_cuts_lon_.55.1979.55.19938."                                                                                          
[525] "lon_cuts_lon_.55.19938.55.20009."                                                                                         
[526] "lon_cuts_lon_.55.20009.55.20124."                                                                                         
[527] "lon_cuts_lon_.55.20124.55.20205."                                                                                         
[528] "lon_cuts_lon_.55.20205.55.20344."                                                                                         
[529] "lon_cuts_lon_.55.20344.55.20391."                                                                                         
[530] "lon_cuts_lon_.55.20391.55.20506."                                                                                         
[531] "lon_cuts_lon_.55.20506.55.20634."                                                                                         
[532] "lon_cuts_lon_.55.20634.55.20729."                                                                                         
[533] "lon_cuts_lon_.55.20729.55.20792."                                                                                         
[534] "lon_cuts_lon_.55.20792.55.20902."                                                                                         
[535] "lon_cuts_lon_.55.20902.55.21209."                                                                                         
[536] "lon_cuts_lon_.55.21209.55.21408."                                                                                         
[537] "lon_cuts_lon_.55.21408.55.21773."                                                                                         
[538] "lon_cuts_lon_.55.21773.55.22097."                                                                                         
[539] "lon_cuts_lon_.54.39476.55.12495."                                                                                         

Summarize data

# Calculate statistics for y_train
n_obs_train <- length(y_train_df)
mean_train <- mean(y_train_df)
Warning: argument is not numeric or logical: returning NA
quartiles_train <- quantile(as.matrix(y_train_df), probs = c(0.25, 0.5, 0.75))

# Calculate statistics for y_test
n_obs_test <- length(y_test_df)
mean_test <- mean(y_test_df)
Warning: argument is not numeric or logical: returning NA
quartiles_test <- quantile(as.matrix(y_test_df), probs = c(0.25, 0.5, 0.75))

# Create the data frame with the statistics
stats_table <- data.frame(
  Dataset = c("y_train", "y_test"),
  Observations = c(n_obs_train, n_obs_test),
  Mean = c(mean_train, mean_test),
  `1st Quartile` = c(quartiles_train[1], quartiles_test[1]),
  Median = c(quartiles_train[2], quartiles_test[2]),
  `3rd Quartile` = c(quartiles_train[3], quartiles_test[3])
)

stats_table_long <- stats_table %>% 
  pivot_longer(cols = -Dataset, names_to = "Metric", values_to = "Value")

# Spread the long format table to wide format with one column for y_train and one for y_test
stats_table_wide <- stats_table_long %>% 
  pivot_wider(names_from = Dataset, values_from = Value)

# Create a rotated LaTeX formatted table
output_stats <- 0
if (output_stats == 1) {
  kable(stats_table_wide, format = "latex", booktabs = TRUE, caption = "Descriptive Statistics of y_train and y_test", row.names = FALSE) %>%
  kable_styling(full_width = FALSE, position = "center", latex_options = "striped") %>%
  row_spec(0, bold = TRUE, color = "white", background = "#56B4E9")
}

LASSO CV

x_test_df[is.na(x_test_df)] <- 0
x_train_df[is.na(x_train_df)] <- 0

cat(dim(x_train_df))
23432 539

Fit model

# Fit model
fit.lasso = cv.glmnet(x=as.matrix(x_train_df), y=y_train, nfolds=10)

Test out of sample

regression_metrics <- function(model, data, y_real, num_scale, y_wout_log) {
 
  pred <- predict(model, newx = as.matrix(data), s = fit.lasso$lambda.min, type = "response")
  
  if (log_price) {
      pred <- 10**pred
      y_real <- y_wout_log
  }
  rmse_value <- rmse(y_real, pred)*num_scale
  mape <- mape(y_real, pred)
  mae <- mae(y_real, pred)*num_scale
  cat('\nRMSE:', rmse_value, 'MAPE:', mape, 'MAE:', mae) 
  
  return(list(rmse=rmse_value, mape=mape, mae=mae))
}

# TEST
q <- regression_metrics(fit.lasso, x_test_df, y_test, num_scale, y_test_orig)

RMSE: 368379.1 MAPE: 14.39842 MAE: 191448
# TRAIN
q <- regression_metrics(fit.lasso, x_train_df, y_train, num_scale, y_train_orig)

RMSE: 227757.2 MAPE: 10.6859 MAE: 145604.1

Ouput coefficients

Ouput collapsed coeffs

# Group prefixes for regression output
coef_table <- coef_table %>%
  mutate(prefix = case_when(
    str_detect(Variable, "same_address_beds_area") ~ "Same address/beds/area",
    str_detect(Variable, "same_address_beds_price") ~ "Same address/beds",
    str_detect(Variable, "same_community_ptype") ~ "Same community/prop. type",
    str_detect(Variable, "same_community_beds") ~ "Same community/beds",
    str_detect(Variable, "same_community_area") ~ "Same community/area",
    str_detect(Variable, "comm_avg_trans_value") ~ "Comm avg. trans value",
    str_detect(Variable, "comm_offplan") ~ "Comm offplan",
    str_detect(Variable, "comm_ready") ~ "Comm ready",
    str_detect(Variable, "AED") ~ "AED exchange rate",
    str_detect(Variable, "USD_") ~ "USD Crypto exchange rates",
    str_detect(Variable, "same_ptype") ~ "Same property type",
    str_detect(Variable, "area") ~ "Area",
    str_detect(Variable, "furnished") ~ "Furnished",
    str_detect(Variable, "baths") ~ "Baths",
    str_detect(Variable, "balcony") ~ "Balcony",
    str_detect(Variable, "swimming_pool") ~ "Swimming pool",
    str_detect(Variable, "parking") ~ "Parking",
    str_detect(Variable, "same_beds_") ~ "Same beds",
    str_detect(Variable, "same_area_") ~ "Same area",
    str_detect(Variable, "same_address") ~ "Same address",
    str_detect(Variable, "metro") ~ "Metro",
    str_detect(Variable, "market") ~ "Market",
    str_detect(Variable, "hospital") ~ "Hospital",
    str_detect(Variable, "community") ~ "Community",
    str_detect(Variable, "(Intercept)") ~ "(Intercept)",
    TRUE ~ "Misc" # For all other cases
  ))

Investigate percentage error

print(deciles)
          0%          10%          20%          30%          40%          50%          60%          70% 
4.457312e-03 1.995456e+00 3.995255e+00 6.094792e+00 8.623564e+00 1.113647e+01 1.402322e+01 1.733744e+01 
         80%          90%         100% 
2.207744e+01 2.976463e+01 1.601915e+02 

Graphs

# Prepare data for graphs 
test_graph <- data.frame(x_test_unscaled)
test_graph$perc_error <- compare_df$perc_error
test_graph$error  <- compare_df$error

test_graph$price <- compare_df$y_test
test_graph 

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiRXJyb3I6IGF0dGVtcHQgdG8gdXNlIHplcm8tbGVuZ3RoIHZhcmlhYmxlIG5hbWVcbiJ9 -->

Error: attempt to use zero-length variable name




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBHcmFwaCBhYnMgZXJyb3JcbnBsb3RfYWJzX2Vycm9yPC0gZ2dwbG90KHRlc3RfZ3JhcGgsIGFlcyh4ID0gcHJpY2UsIHkgPSBlcnJvcikpICtcbiAgdGhlbWVfbWluaW1hbCgpICtcbiAgZ2VvbV9wb2ludChjb2xvciA9ICcjMWY3N2I0JyAsc2l6ZSA9IDAuNSkgKyAgIyBTY2F0dGVyIHBsb3QgcG9pbnRzXG4gIHhsYWIoXCJQcmljZVwiKSArXG4gIHlsYWIoXCJBYnNvbHV0ZSBFcnJvclwiKSArIFxuICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj1cIm5vbmVcIixcbiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLCAgIyBBZGp1c3QgdGhlIGZvbnQgc2l6ZSBoZXJlXG4gICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwgICMgQWRqdXN0IHRoZSB0aXRsZSBmb250IHNpemVcbiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpICsgICMgQWRqdXN0IHRoZSBheGlzIHRleHQgZm9udCBzaXplXG4gIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmNvbW1hKSBcbnBsb3RfYWJzX2Vycm9yXG5gYGAifQ== -->

```r
# Graph abs error
plot_abs_error<- ggplot(test_graph, aes(x = price, y = error)) +
  theme_minimal() +
  geom_point(color = '#1f77b4' ,size = 0.5) +  # Scatter plot points
  xlab("Price") +
  ylab("Absolute Error") + 
    theme(legend.position="none",
        text = element_text(size = 16),  # Adjust the font size here
        axis.title = element_text(size = 16),  # Adjust the title font size
        axis.text = element_text(size = 10)) +  # Adjust the axis text font size
  scale_x_continuous(labels = scales::comma) 
plot_abs_error

# Graph prediction error

#Prepare data
test_graph_dt <- test_graph %>% as.data.table

test_graph_dt[, community := 'Dubai Marina']

test_graph_dt<- test_graph_dt %>%
  .[community_Jumeirah.Beach.Residence..JBR.==T, community := 'Jumeirah Beach \n Residence (JBR)'] %>%
  .[community_Jumeirah.Lake.Towers..JLT.==T, community := 'Jumeirah Lake \n Towers (JLT)'] %>%
  .[community_Jumeirah.Village.Circle..JVC.==T, community := 'Jumeirah Village \n Circle (JVC)']


# Produce plot
plot_perc_error_community <- ggplot(test_graph_dt, aes(y=community, x=perc_error, color=community)) + 
  geom_violin(aes(fill = community,
                  fill = after_scale(colorspace::lighten(fill, .2))),
              draw_quantiles = c(0.05, 0.25, 0.5, 0.75, 0.95),
              size = 0.2, scale='width', colour = "black") +
  theme_minimal() + 
  theme(legend.position="none",
        text = element_text(size = 16),  # Adjust the font size here
        axis.title = element_text(size = 16),  # Adjust the title font size
        axis.text = element_text(size = 10),  # Adjust the axis text font size
        axis.ticks = element_line(size = 0.8),
        axis.title.y.left=element_text(color="black", size=14),
        axis.text.y.left=element_text(color="black", size=12),
        axis.title.y.right=element_text(color="black", size=14),
        axis.text.y.right=element_text(color="black", size=14),
        axis.text.x=element_text(size=12),
        axis.title.x=element_text(size=16),
        plot.title = element_text(hjust = 0.5, size = 16, face = "bold")) +  # Adjust the axis ticks size
  scale_x_continuous(labels = scales::comma) +
  labs(y='', x="Prediction Error (%)") 
plot_perc_error_community

Setting g

BMS

# Fit model
fit.bayesreg <- modelSelection(price ~ ., data=train_df, priorCoef=zellnerprior(taustd =  1), priorDelta=modelbbprior(1,1), niter=30000)
Greedy searching posterior mode... Done.
Running Gibbs sampler......
# Convergence checks 
margppest= matrix(NA,nrow=nrow(fit.bayesreg$postSample),ncol=ncol(fit.bayesreg$postSample))
for (j in 1:ncol(fit.bayesreg$postSample)) {
    margppest[,j]= cumsum(fit.bayesreg$postSample[,j])/(1:nrow(fit.bayesreg$postSample))
}

par(mar=c(4,5,.1,.1), cex.lab=1, cex.axis=1)
plot(margppest[,1], type='l', ylim=c(0,1), xlab='Gibbs iteration', ylab='Estimated P(gamma_j=1 | y)')
for (j in 2:ncol(margppest)) lines(margppest[,j])
bayes_pred= predict(fit.bayesreg, data = x_train_df, newdata =x_test_df)

# RMSE
rmse_value <- rmse(y_test, bayes_pred)
print(rmse_value) # 211412.2

# Calculate MAPE
mape <- mean(abs((y_test - bayes_pred) / y_test)) * 100
print(mape)
# Prepare data 
test_graph$bayes_pred_25 <- bayes_pred[,2]
test_graph$bayes_pred_975 <- bayes_pred[,3]
test_graph$bayes_pred <- bayes_pred[,1]
test_graph$perc_error_bayes <- abs((test_graph$price - test_graph$bayes_pred) / test_graph$price) * 100
test_graph$perc_error_bayes <- (test_graph$price - test_graph$bayes_pred) 

# New column to determine color
test_graph$color <- ifelse(test_graph$price > test_graph$bayes_pred_25 & test_graph$price < test_graph$bayes_pred_975, "#1f77b4", "red")

# Graph percentage error bayes with color condition
plot_perc_error_bayes <- ggplot(test_graph, aes(x = price, y = perc_error_bayes, color = color)) +
  theme_minimal() +
  geom_point(size = 0.5) +  # Scatter plot points
  xlab("Price") +
  ylab("Percentage Error") +
  theme(legend.position = "none",
        text = element_text(size = 16),  # Adjust the font size here
        axis.title = element_text(size = 16),  # Adjust the title font size
        axis.text = element_text(size = 10)) +  # Adjust the axis text font size
  scale_x_continuous(labels = scales::comma) +
  scale_color_identity()  # Use the actual colors specified in the data frame

plot_perc_error_bayes
freq_table_colour<- table(test_graph$color)
freq_table_colour
#Prepare data
test_graph_sorted<- test_graph %>% arrange(price) %>% mutate(obs = seq(1:length(price)))
test_graph_dt_2 <- test_graph_sorted %>% as.data.table
test_graph_dt_2[, community := 'Dubai Marina']
test_graph_dt_2<- test_graph_dt_2 %>%
  .[community_Jumeirah.Beach.Residence..JBR.==T, community := 'Jumeirah Beach \n Residence (JBR)'] %>%
  .[community_Jumeirah.Lake.Towers..JLT.==T, community := 'Jumeirah Lake \n Towers (JLT)'] %>%
  .[community_Jumeirah.Village.Circle..JVC.==T, community := 'Jumeirah Village \n Circle (JVC)']

# Assuming 'community' is the column name that contains the community information
filtered_data <- test_graph_dt_2 %>% 
  filter(grepl("JVC", community))

# Define colors for actual and prediction points
colors <- c('actual' = 'blue', 'prediction' = 'red')

# Create the plot
ggplot(filtered_data, aes(x = seq_along(price), y = price)) + 
  geom_point(aes(color = 'actual'), size = 0.1) + 
  geom_point(aes(y = bayes_pred, color = 'prediction'), size = 0.1) + 
    geom_errorbar(aes(ymin = bayes_pred_25, ymax = bayes_pred_975), width = 0.01) + 
  labs(x = "Observation number (ranked)", 
       y = "Price and Bayesian Prediction", 
       color = "Legend") +
  scale_color_manual(values = colors) + 
  ggtitle('Credible Intervals for Predictions with BMA')
coef(fit.bayesreg)
coef(fit.bayesreg)[order(coef(fit.bayesreg)[,4], decreasing = TRUE),]
LS0tCnRpdGxlOiAiUHJvamVjdCA1LzEyIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyfQpybShsaXN0ID0gbHMoKSkKYGBgCgojIEluc3RhbGwgcGFja2FnZXMKYGBge3J9CmxpYnJhcnkobW9tYmYpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ2dzY2kpCmxpYnJhcnkoaGRtKQpsaWJyYXJ5KGdsbW5ldCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShIRENJKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShwUk9DKQpsaWJyYXJ5KCJhZGFwdDRwdiIpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShyZWFkcikKbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKIyMgUHJlcAojIyBMb2FkIGRhdGEKYGBge3J9CiMgTG9hZCBkYXRhCkRJUiA8LSAnZGF0YS8nCkRJUiA8LSAnL1VzZXJzL2Nhcmxvc3BlcmV6cmljYXJkby9Eb3dubG9hZHMvJwoKcmF3X3RyYWluIDwtIHJlYWQuY3N2KHBhc3RlMChESVIsJ3JlYWxlc3RhdGVfdHJhaW4uY3N2JykpCnJhd190ZXN0IDwtIHJlYWQuY3N2KHBhc3RlMChESVIsJ3JlYWxlc3RhdGVfdGVzdC5jc3YnKSkKYGBgCgpgYGB7cn0Kbl9hZGRyZXNzZXMgPC0gMTAKZHVtbXlfYWRkcmVzc2VzIDwtIFQKZHVtbXlfc3ViZGlzdHJpY3RzIDwtIFQKZHVtbXlfY29vcmRpbmF0ZXMgPC0gVApxY3V0cyA8LSA1MApkcm9wX3ByZXZfcHJpY2VzIDwtIFQKCmxvZ19wcmljZSA8LSBUCmBgYAoKYGBge3J9CiMgRmlsdGVyIGFkZHJlc3NlcwphZGRyZXNzX2NvdW50cyA8LSByYXdfdHJhaW4gJT4lIGNvdW50KGFkZHJlc3Nfc2ltcGxlKQpzZWxlY3RlZF9hZGRyZXNzZXMgPC0gYWRkcmVzc19jb3VudHNbYWRkcmVzc19jb3VudHMkbiA+IG5fYWRkcmVzc2VzLCBdJGFkZHJlc3Nfc2ltcGxlCgpjYXQoJ1RyYWluIHNpemUgYmVmb3JlJywgZGltKHJhd190cmFpbiksICc6IGFmdGVyJywgZGltKHJhd190cmFpbltyYXdfdHJhaW4kYWRkcmVzc19zaW1wbGUgJWluJSBzZWxlY3RlZF9hZGRyZXNzZXMsIF0pKQpyYXdfdHJhaW4gPC0gcmF3X3RyYWluW3Jhd190cmFpbiRhZGRyZXNzX3NpbXBsZSAlaW4lIHNlbGVjdGVkX2FkZHJlc3NlcywgXQoKY2F0KCdUcmFpbiBzaXplIGJlZm9yZScsIGRpbShyYXdfdGVzdCksICc6IGFmdGVyJywgZGltKHJhd190ZXN0W3Jhd190ZXN0JGFkZHJlc3Nfc2ltcGxlICVpbiUgc2VsZWN0ZWRfYWRkcmVzc2VzLCBdKSkKcmF3X3Rlc3QgPC0gcmF3X3Rlc3RbcmF3X3Rlc3QkYWRkcmVzc19zaW1wbGUgJWluJSBzZWxlY3RlZF9hZGRyZXNzZXMsIF0KYGBgCgojIyBBZGRyZXNzIGR1bW1pZXMKCmBgYHtyfQpnZW5lcmF0ZV9kdW1taWVzIDwtIGZ1bmN0aW9uKHRyYWluLCB0ZXN0LCBjb2x1bW4pIHsKICAjIENvbWJpbmUgdHJhaW4gYW5kIHRlc3QKICBjb21iaW5lZF9kYXRhIDwtIHJiaW5kKHRyYWluLCB0ZXN0KQogIAogICMgQ3JlYXRpbmcgZHVtbXkgdmFyaWFibGVzIChhc3N1bWluZyAnY2F0ZWdvcnknIGlzIHlvdXIgY2F0ZWdvcmljYWwgY29sdW1uKQogIGNvbWJpbmVkX2RhdGFfZHVtbXkgPC0gbW9kZWwubWF0cml4KH4gZ2V0KGNvbHVtbikgLSAxLCBjb21iaW5lZF9kYXRhKQogIAogIGNvbF9uYW1lcyA8LSBzdHJpbmdyOjpzdHJfcmVwbGFjZShjb2xuYW1lcyhjb21iaW5lZF9kYXRhX2R1bW15KSwgImdldFxcKGNvbHVtblxcKSIsIHBhc3RlMChjb2x1bW4sICdfJykpCiAgI3ByaW50KGNvbF9uYW1lcykKICBjb2xuYW1lcyhjb21iaW5lZF9kYXRhX2R1bW15KSA8LSBjb2xfbmFtZXMKICAKICAjIFNwbGl0dGluZyBiYWNrIGludG8gdHJhaW5pbmcgYW5kIHRlc3Rpbmcgc2V0cwogIHRyYWluX3Jvd3MgPC0gbnJvdyh0cmFpbikKICB4X3RyYWluX2R1bW15IDwtIGNvbWJpbmVkX2RhdGFfZHVtbXlbMTp0cmFpbl9yb3dzLCBdCiAgeF90ZXN0X2R1bW15IDwtIGNvbWJpbmVkX2RhdGFfZHVtbXlbKHRyYWluX3Jvd3MgKyAxKTpucm93KGNvbWJpbmVkX2RhdGFfZHVtbXkpLCBdCiAgCiAgIyBBZGQgdGhlIGR1bW15IHZhcmlhYmxlcyB0byB0aGUgb3JpZ2luYWwgZGF0YWZyYW1lcwogIHRyYWluIDwtIGNiaW5kKHRyYWluLCB4X3RyYWluX2R1bW15KQogIHRlc3QgPC0gY2JpbmQodGVzdCwgeF90ZXN0X2R1bW15KQogIAogIHJldHVybihsaXN0KHRyYWluID0gdHJhaW4sIHRlc3QgPSB0ZXN0KSkKfQoKaWYgKGR1bW15X2FkZHJlc3NlcykgewogIHJlc3VsdCA8LSBnZW5lcmF0ZV9kdW1taWVzKHJhd190cmFpbiwgcmF3X3Rlc3QsICdhZGRyZXNzX3NpbXBsZScpCiAgcmF3X3RyYWluIDwtIHJlc3VsdCR0cmFpbgogIHJhd190ZXN0IDwtIHJlc3VsdCR0ZXN0ICAKfQpgYGAKCiMjIFN1YmRpc3RyaWN0IGR1bW1pZXMgCgpgYGB7cn0Kb2J0YWluX3N1YmRpc3RyaWN0IDwtIGZ1bmN0aW9uKGRmKSB7CiAgZGYkc3ViZGlzdHJpY3QgPC0gc2FwcGx5KHN0cnNwbGl0KGRmJGFkZHJlc3Nfc2ltcGxlLCAiLFxccyoiKSwgZnVuY3Rpb24oeCkgeFtbMl1dKQogIGRmW2RmJHN1YmRpc3RyaWN0ID09ICdEdWJhaScsICdzdWJkaXN0cmljdCddIDwtIHNhcHBseShzdHJzcGxpdChkZltkZiRzdWJkaXN0cmljdCA9PSAnRHViYWknLCAnYWRkcmVzc19zaW1wbGUnXSwgIixcXHMqIiksIGZ1bmN0aW9uKHgpIHhbWzFdXSkgIAogIAogIHJldHVybihkZikKfQoKaWYgKGR1bW15X3N1YmRpc3RyaWN0cykgewogIHJhd190cmFpbiA8LSBvYnRhaW5fc3ViZGlzdHJpY3QocmF3X3RyYWluKQogIHJhd190ZXN0IDwtIG9idGFpbl9zdWJkaXN0cmljdChyYXdfdGVzdCkKICAKICByZXN1bHQgPC0gZ2VuZXJhdGVfZHVtbWllcyhyYXdfdHJhaW4sIHJhd190ZXN0LCAnc3ViZGlzdHJpY3QnKQogIHJhd190cmFpbiA8LSByZXN1bHQkdHJhaW4KICByYXdfdGVzdCA8LSByZXN1bHQkdGVzdCAgCn0KYGBgCgojIyBDb29yZGluYXRlcwpgYGB7cn0KZG9fcXVhbnRpbGVzIDwtIGZ1bmN0aW9uKGRhdGEsIHF1YW50aWxlcywgcHJlZml4KSB7CiAgICBjdXRzIDwtIGN1dChkYXRhLCBxdWFudGlsZXMsIGluY2x1ZGUubG93ZXN0ID0gVCkKICAgIGN1dHMgPC0gcGFzdGUwKHByZWZpeCwgY3V0cykKICAgIHJldHVybihjdXRzKQp9CiAgCmNvbWJpbmVkX2RhdGEgPC0gcmJpbmQocmF3X3RyYWluLCByYXdfdGVzdCkKIyBMYXQKcXVhbnRpbGVzIDwtIHVuaXF1ZShxdWFudGlsZShjb21iaW5lZF9kYXRhJGxhdCwgMDpxY3V0cy9xY3V0cykpCnJhd190cmFpbiRsYXRfY3V0cyA8LSBkb19xdWFudGlsZXMocmF3X3RyYWluJGxhdCwgcXVhbnRpbGVzLCAnbGF0XycpCnJhd190ZXN0JGxhdF9jdXRzIDwtIGRvX3F1YW50aWxlcyhyYXdfdGVzdCRsYXQsIHF1YW50aWxlcywgJ2xhdF8nKQogIAojIExvbgpxdWFudGlsZXMgPC0gdW5pcXVlKHF1YW50aWxlKGNvbWJpbmVkX2RhdGEkbG9uLCAwOnFjdXRzL3FjdXRzKSkKcmF3X3RyYWluJGxvbl9jdXRzIDwtIGRvX3F1YW50aWxlcyhyYXdfdHJhaW4kbG9uLCBxdWFudGlsZXMsICdsb25fJykKcmF3X3Rlc3QkbG9uX2N1dHMgPC0gZG9fcXVhbnRpbGVzKHJhd190ZXN0JGxvbiwgcXVhbnRpbGVzLCAnbG9uXycpCgppZiAoZHVtbXlfY29vcmRpbmF0ZXMpIHsKICAjIExhdAogIHJlc3VsdCA8LSBnZW5lcmF0ZV9kdW1taWVzKHJhd190cmFpbiwgcmF3X3Rlc3QsICdsYXRfY3V0cycpCiAgcmF3X3RyYWluIDwtIHJlc3VsdCR0cmFpbgogIHJhd190ZXN0IDwtIHJlc3VsdCR0ZXN0ICAKICAKICAjIExvbgogIHJlc3VsdCA8LSBnZW5lcmF0ZV9kdW1taWVzKHJhd190cmFpbiwgcmF3X3Rlc3QsICdsb25fY3V0cycpCiAgcmF3X3RyYWluIDwtIHJlc3VsdCR0cmFpbgogIHJhd190ZXN0IDwtIHJlc3VsdCR0ZXN0ICAKfQpgYGAKCmBgYHtyfQp0ZXN0IDwtIHJhd190ZXN0IAp0cmFpbiA8LXJhd190cmFpbgoKIyBDb252ZXJ0IGRhdGUgdG8gbnVtZXJpYwp0cmFpbiRkYXRlX2FkZGVkIDwtIGFzLkRhdGUodHJhaW4kZGF0ZV9hZGRlZCkKCiMgS2VlcCBudW1lcmljIGNvbHVtbnMKbnVtZXJpYyA8LSBzYXBwbHkodHJhaW4sIGlzLm51bWVyaWMpCgp0cmFpbiA8LSB0cmFpblssIG51bWVyaWNdCnRlc3QgPC0gdGVzdFssIG51bWVyaWNdCgojIFJlbW92ZSBjb2x1bW5zIHdpdGggMCB2YXJpYW5jZSAKdGVzdD0gdGVzdFssYXBwbHkodGVzdCwgMiwgdmFyKSA+IDBdICNyZW1vdmUgY29sdW1ucyB3aXRoIDAgdmFyaWFuY2UKdHJhaW49IHRyYWluWyxhcHBseSh0cmFpbiwgMiwgdmFyKSA+IDBdICNyZW1vdmUgY29sdW1ucyB3aXRoIDAgdmFyaWFuY2UKCmNhdChkaW0odHJhaW4pLCBkaW0odGVzdCkpCgojIFRvIGhhdmUgc2FtZSBjb2x1bW5zIGluIHRyYWluIGFuZCB0ZXN0CnRyYWluIDwtIHRyYWluWywgaW50ZXJzZWN0KG5hbWVzKHRyYWluKSwgbmFtZXModGVzdCkpXQp0ZXN0IDwtIHRlc3RbLCBpbnRlcnNlY3QobmFtZXModHJhaW4pLCBuYW1lcyh0ZXN0KSldCgpjYXQoZGltKHRyYWluKSwgZGltKHRlc3QpKQpgYGAKCiMjIFJlbW92ZSBoaWdobHkgY29ycmVsYXRlZCB2YXJpYWJsZXMKYGBge3J9CiMgQ2hlY2sgZm9yIGNvcnJlbGF0aW9uCmNvcnJlbGF0aW9uX21hdHJpeCA8LSBjb3IodHJhaW4pCmhpZ2hfY29ycmVsYXRpb24gPC0gd2hpY2goYWJzKGNvcnJlbGF0aW9uX21hdHJpeCkgPiAwLjk5LCBhcnIuaW5kID0gVFJVRSkKCiMgUmV0dXJuIHdoaWNoIHZhcmlhYmxlcyBhcmUgZ2V0dGluZyByZW1vdmV4CmhpZ2hfY29ycmVsYXRpb24gPC0gaGlnaF9jb3JyZWxhdGlvbltoaWdoX2NvcnJlbGF0aW9uWywgMV0gPCBoaWdoX2NvcnJlbGF0aW9uWywgMl0sIF0KcGFpcnNfdG9fcmVtb3ZlIDwtIGFwcGx5KGhpZ2hfY29ycmVsYXRpb24sIDEsIGZ1bmN0aW9uKGluZGV4KSB7CiAgcGFpciA8LSBjb2xuYW1lcyh0cmFpbilbaW5kZXhdCiAgI2NhdCgiSGlnaCBjb3JyZWxhdGlvbiBiZXR3ZWVuOiIsIHBhaXJbMV0sICJhbmQiLCBwYWlyWzJdLCAiXG4iKQogICNjYXQoIlJlbW92aW5nOiIsIHBhaXJbMl0sICJcblxuIikKICByZXR1cm4ocGFpclsyXSkKfSkKCiMgUmVtb3ZlCnRlc3QgPC0gdGVzdFssICFjb2xuYW1lcyh0ZXN0KSAlaW4lIHBhaXJzX3RvX3JlbW92ZV0KdHJhaW4gPC0gdHJhaW5bLCAhY29sbmFtZXModHJhaW4pICVpbiUgcGFpcnNfdG9fcmVtb3ZlXQpgYGAKCiMjIFByZXBhcmUgZGF0YWZyYW1lcwoKYGBge3J9CiMgU3BsaXQgaW50byBYIGFuZCBZIGZvciBzY2FsaW5nCnhfdHJhaW4gPC0gc2VsZWN0KHRyYWluLCAtcHJpY2UpCgpudW1fc2NhbGUgPC0gMTAwMDAwICMgdG8gbWFrZSB3ZWlnaHRzIG1vcmUgaW50ZXJwcmV0YWJsZQp5X3RyYWluX29yaWcgPC0gdHJhaW4kcHJpY2UvbnVtX3NjYWxlCmlmIChsb2dfcHJpY2UpIHsKICB5X3RyYWluIDwtIGxvZzEwKHRyYWluJHByaWNlL251bV9zY2FsZSkKfSBlbHNlewogIHlfdHJhaW4gPC0gdHJhaW4kcHJpY2UvbnVtX3NjYWxlCn0KCnhfdGVzdCA8LSBzZWxlY3QodGVzdCwgLXByaWNlKQp5X3Rlc3Rfb3JpZyA8LSB0ZXN0JHByaWNlL251bV9zY2FsZQppZiAobG9nX3ByaWNlKSB7CiAgeV90ZXN0IDwtIGxvZzEwKHRlc3QkcHJpY2UvbnVtX3NjYWxlKQp9IGVsc2V7CiAgeV90ZXN0IDwtIHRlc3QkcHJpY2UvbnVtX3NjYWxlCn0KCiMgU2F2ZSB1bnNjYWxlZAp4X3RyYWluX3Vuc2NhbGVkIDwtIHhfdHJhaW4KeF90ZXN0X3Vuc2NhbGVkIDwtIHhfdGVzdAoKIyBTY2FsZSAKeF90cmFpbiA8LSBzY2FsZSh4X3RyYWluKQp4X3Rlc3QgPC0gc2NhbGUoeF90ZXN0KQoKIyBDcmVhdGUgZGZzCnlfdHJhaW5fZGYgPC0gZGF0YS5mcmFtZSh5X3RyYWluKQp4X3RyYWluX2RmIDwtIGRhdGEuZnJhbWUoeF90cmFpbikKY29sbmFtZXMoeV90cmFpbl9kZik8LSdwcmljZScKCnlfdGVzdF9kZiA8LSBkYXRhLmZyYW1lKHlfdGVzdCkKeF90ZXN0X2RmIDwtIGRhdGEuZnJhbWUoeF90ZXN0KQpjb2xuYW1lcyh5X3Rlc3RfZGYpPC0ncHJpY2UnCgojIEFzc3VtaW5nIHhfdGVzdCBpcyB5b3VyIGRhdGFmcmFtZQppZiAoZHJvcF9wcmV2X3ByaWNlcykgewogIHhfdGVzdF9kZiA8LSB4X3Rlc3RfZGYgJT4lIHNlbGVjdCgtY29udGFpbnMoInNhbWUiKSkKICB4X3RyYWluX2RmIDwtIHhfdHJhaW5fZGYgJT4lIHNlbGVjdCgtY29udGFpbnMoInNhbWUiKSkKfQoKdHJhaW5fZGY8LWNiaW5kKHhfdHJhaW5fZGYseV90cmFpbl9kZikKdGVzdF9kZjwtY2JpbmQoeF90ZXN0X2RmLHlfdGVzdF9kZikKYGBgCgojIyBEZWZpbmUgUk1TRSAKYGBge3J9CiMgUmVncmVzc2lvbiBtZXRyaWNzCnJtc2UgPC0gZnVuY3Rpb24ob2JzZXJ2ZWQsIHByZWRpY3RlZCkgewogIHNxcnQobWVhbigob2JzZXJ2ZWQgLSBwcmVkaWN0ZWQpIF4gMikpCn0KCmxvZ19ybXNlIDwtIGZ1bmN0aW9uKG9ic2VydmVkLCBwcmVkaWN0ZWQpIHsKICBzcXJ0KG1lYW4oKGxvZyhvYnNlcnZlZCkgLSBsb2cocHJlZGljdGVkKSkgXiAyKSkKfQoKbWFwZSA8LSBmdW5jdGlvbihvYnNlcnZlZCwgcHJlZGljdGVkKSB7CiAgbWVhbihhYnMoKHByZWRpY3RlZCAtIG9ic2VydmVkKSAvIG9ic2VydmVkKSkgKiAxMDAKfQoKbWFlIDwtIGZ1bmN0aW9uKG9ic2VydmVkLCBwcmVkaWN0ZWQpIHsKICBtZWFuKGFicyhvYnNlcnZlZCAtIHByZWRpY3RlZCkpCn0KYGBgCgoKYGBge3J9CmNvbG5hbWVzKHhfdHJhaW5fZGYpCmBgYAoKCiMjIFN1bW1hcml6ZSBkYXRhIAoKYGBge3J9CiMgQ2FsY3VsYXRlIHN0YXRpc3RpY3MgZm9yIHlfdHJhaW4Kbl9vYnNfdHJhaW4gPC0gbGVuZ3RoKHlfdHJhaW5fZGYpCm1lYW5fdHJhaW4gPC0gbWVhbih5X3RyYWluX2RmKQpxdWFydGlsZXNfdHJhaW4gPC0gcXVhbnRpbGUoYXMubWF0cml4KHlfdHJhaW5fZGYpLCBwcm9icyA9IGMoMC4yNSwgMC41LCAwLjc1KSkKCiMgQ2FsY3VsYXRlIHN0YXRpc3RpY3MgZm9yIHlfdGVzdApuX29ic190ZXN0IDwtIGxlbmd0aCh5X3Rlc3RfZGYpCm1lYW5fdGVzdCA8LSBtZWFuKHlfdGVzdF9kZikKcXVhcnRpbGVzX3Rlc3QgPC0gcXVhbnRpbGUoYXMubWF0cml4KHlfdGVzdF9kZiksIHByb2JzID0gYygwLjI1LCAwLjUsIDAuNzUpKQoKIyBDcmVhdGUgdGhlIGRhdGEgZnJhbWUgd2l0aCB0aGUgc3RhdGlzdGljcwpzdGF0c190YWJsZSA8LSBkYXRhLmZyYW1lKAogIERhdGFzZXQgPSBjKCJ5X3RyYWluIiwgInlfdGVzdCIpLAogIE9ic2VydmF0aW9ucyA9IGMobl9vYnNfdHJhaW4sIG5fb2JzX3Rlc3QpLAogIE1lYW4gPSBjKG1lYW5fdHJhaW4sIG1lYW5fdGVzdCksCiAgYDFzdCBRdWFydGlsZWAgPSBjKHF1YXJ0aWxlc190cmFpblsxXSwgcXVhcnRpbGVzX3Rlc3RbMV0pLAogIE1lZGlhbiA9IGMocXVhcnRpbGVzX3RyYWluWzJdLCBxdWFydGlsZXNfdGVzdFsyXSksCiAgYDNyZCBRdWFydGlsZWAgPSBjKHF1YXJ0aWxlc190cmFpblszXSwgcXVhcnRpbGVzX3Rlc3RbM10pCikKCnN0YXRzX3RhYmxlX2xvbmcgPC0gc3RhdHNfdGFibGUgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gLURhdGFzZXQsIG5hbWVzX3RvID0gIk1ldHJpYyIsIHZhbHVlc190byA9ICJWYWx1ZSIpCgojIFNwcmVhZCB0aGUgbG9uZyBmb3JtYXQgdGFibGUgdG8gd2lkZSBmb3JtYXQgd2l0aCBvbmUgY29sdW1uIGZvciB5X3RyYWluIGFuZCBvbmUgZm9yIHlfdGVzdApzdGF0c190YWJsZV93aWRlIDwtIHN0YXRzX3RhYmxlX2xvbmcgJT4lIAogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBEYXRhc2V0LCB2YWx1ZXNfZnJvbSA9IFZhbHVlKQoKIyBDcmVhdGUgYSByb3RhdGVkIExhVGVYIGZvcm1hdHRlZCB0YWJsZQpvdXRwdXRfc3RhdHMgPC0gMAppZiAob3V0cHV0X3N0YXRzID09IDEpIHsKICBrYWJsZShzdGF0c190YWJsZV93aWRlLCBmb3JtYXQgPSAibGF0ZXgiLCBib29rdGFicyA9IFRSVUUsIGNhcHRpb24gPSAiRGVzY3JpcHRpdmUgU3RhdGlzdGljcyBvZiB5X3RyYWluIGFuZCB5X3Rlc3QiLCByb3cubmFtZXMgPSBGQUxTRSkgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIsIGxhdGV4X29wdGlvbnMgPSAic3RyaXBlZCIpICU+JQogIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiIzU2QjRFOSIpCn0KYGBgCgojIExBU1NPIENWIAoKYGBge3J9CnhfdGVzdF9kZltpcy5uYSh4X3Rlc3RfZGYpXSA8LSAwCnhfdHJhaW5fZGZbaXMubmEoeF90cmFpbl9kZildIDwtIDAKCmNhdChkaW0oeF90cmFpbl9kZikpCmBgYAoKCiMjIEZpdCBtb2RlbApgYGB7cn0KIyBGaXQgbW9kZWwKZml0Lmxhc3NvID0gY3YuZ2xtbmV0KHg9YXMubWF0cml4KHhfdHJhaW5fZGYpLCB5PXlfdHJhaW4sIG5mb2xkcz0xMCkKZml0Lmxhc3NvCmBgYAoKIyMgVGVzdCBvdXQgb2Ygc2FtcGxlCgoKCmBgYHtyfQpyZWdyZXNzaW9uX21ldHJpY3MgPC0gZnVuY3Rpb24obW9kZWwsIGRhdGEsIHlfcmVhbCwgbnVtX3NjYWxlLCB5X3dvdXRfbG9nKSB7CiAKICBwcmVkIDwtIHByZWRpY3QobW9kZWwsIG5ld3ggPSBhcy5tYXRyaXgoZGF0YSksIHMgPSBmaXQubGFzc28kbGFtYmRhLm1pbiwgdHlwZSA9ICJyZXNwb25zZSIpCiAgCiAgaWYgKGxvZ19wcmljZSkgewogICAgICBwcmVkIDwtIDEwKipwcmVkCiAgICAgIHlfcmVhbCA8LSB5X3dvdXRfbG9nCiAgfQogIHJtc2VfdmFsdWUgPC0gcm1zZSh5X3JlYWwsIHByZWQpKm51bV9zY2FsZQogIG1hcGUgPC0gbWFwZSh5X3JlYWwsIHByZWQpCiAgbWFlIDwtIG1hZSh5X3JlYWwsIHByZWQpKm51bV9zY2FsZQogIGNhdCgnXG5STVNFOicsIHJtc2VfdmFsdWUsICdNQVBFOicsIG1hcGUsICdNQUU6JywgbWFlKSAKICAKICByZXR1cm4obGlzdChybXNlPXJtc2VfdmFsdWUsIG1hcGU9bWFwZSwgbWFlPW1hZSkpCn0KCiMgVEVTVApxIDwtIHJlZ3Jlc3Npb25fbWV0cmljcyhmaXQubGFzc28sIHhfdGVzdF9kZiwgeV90ZXN0LCBudW1fc2NhbGUsIHlfdGVzdF9vcmlnKQoKIyBUUkFJTgpxIDwtIHJlZ3Jlc3Npb25fbWV0cmljcyhmaXQubGFzc28sIHhfdHJhaW5fZGYsIHlfdHJhaW4sIG51bV9zY2FsZSwgeV90cmFpbl9vcmlnKQpgYGAKCiMjIE91cHV0IGNvZWZmaWNpZW50cyAKYGBge3J9CiMgRXh0cmFjdCBjb2VmZmljaWVudHMKY29lZl9sYXNzbyA8LSBwcmVkaWN0KGZpdC5sYXNzbywgdHlwZSA9ICJjb2VmZmljaWVudHMiLCBzID0gZml0Lmxhc3NvJGxhbWJkYS5taW4pCmNvZWZfbWF0cml4IDwtIGFzLm1hdHJpeChjb2VmX2xhc3NvKQoKIyBPdXRwdXQgbm9uIHplcm8gY29lZmZpY2llbnRzCm5vbl96ZXJvIDwtIGNvZWZfbWF0cml4ICE9MApjb2VmX3RhYmxlIDwtIGRhdGEuZnJhbWUoVmFyaWFibGUgPSByb3duYW1lcyhjb2VmX21hdHJpeClbbm9uX3plcm9dLCBDb2VmZmljaWVudHMgPSBjb2VmX21hdHJpeFtub25femVyb10pCmNvZWZfdGFibGUgPC0gY29lZl90YWJsZVtvcmRlcigtYWJzKGNvZWZfdGFibGUkQ29lZmZpY2llbnRzKSksXQpjb2VmX3RhYmxlJENvZWZmaWNpZW50cyA8LSByb3VuZChjb2VmX3RhYmxlJENvZWZmaWNpZW50cywgZGlnaXRzID0gNCkKY29lZl90YWJsZSRDb2VmZmljaWVudHMgPC0gZm9ybWF0KGNvZWZfdGFibGUkQ29lZmZpY2llbnRzLCBzY2llbnRpZmljID0gRkFMU0UpCmNvZWZfdGFibGVfb3V0cHV0IDwtIGNvZWZfdGFibGVbMDoyMCxdCmNvZWZfdGFibGVfb3V0cHV0CgojIE91dHB1dCB0byBMYXRleApvdXRwdXRfbGFzc28gPC0gMAppZiAob3V0cHV0X2xhc3NvID09IDEpIHsKICBrYWJsZShjb2VmX3RhYmxlX291dHB1dCwgZm9ybWF0ID0gImxhdGV4IiwgYm9va3RhYnMgPSBUUlVFLCBjYXB0aW9uID0gIlJlZ3Jlc3Npb24gT3V0cHV0Iiwgcm93Lm5hbWVzID0gRkFMU0UpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJjZW50ZXIiKSAlPiUKICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSwgYm9yZGVyX3JpZ2h0ID0gVFJVRSkgJT4lCiAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiNmVtIikgJT4lCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjNTZCNEU5IikKfQpgYGAKCgojIyBPdXB1dCBjb2xsYXBzZWQgY29lZmZzIAoKYGBge3J9CiMgR3JvdXAgcHJlZml4ZXMgZm9yIHJlZ3Jlc3Npb24gb3V0cHV0CmNvZWZfdGFibGUgPC0gY29lZl90YWJsZSAlPiUKICBtdXRhdGUocHJlZml4ID0gY2FzZV93aGVuKAogICAgc3RyX2RldGVjdChWYXJpYWJsZSwgInNhbWVfYWRkcmVzc19iZWRzX2FyZWEiKSB+ICJTYW1lIGFkZHJlc3MvYmVkcy9hcmVhIiwKICAgIHN0cl9kZXRlY3QoVmFyaWFibGUsICJzYW1lX2FkZHJlc3NfYmVkc19wcmljZSIpIH4gIlNhbWUgYWRkcmVzcy9iZWRzIiwKICAgIHN0cl9kZXRlY3QoVmFyaWFibGUsICJzYW1lX2NvbW11bml0eV9wdHlwZSIpIH4gIlNhbWUgY29tbXVuaXR5L3Byb3AuIHR5cGUiLAogICAgc3RyX2RldGVjdChWYXJpYWJsZSwgInNhbWVfY29tbXVuaXR5X2JlZHMiKSB+ICJTYW1lIGNvbW11bml0eS9iZWRzIiwKICAgIHN0cl9kZXRlY3QoVmFyaWFibGUsICJzYW1lX2NvbW11bml0eV9hcmVhIikgfiAiU2FtZSBjb21tdW5pdHkvYXJlYSIsCiAgICBzdHJfZGV0ZWN0KFZhcmlhYmxlLCAiY29tbV9hdmdfdHJhbnNfdmFsdWUiKSB+ICJDb21tIGF2Zy4gdHJhbnMgdmFsdWUiLAogICAgc3RyX2RldGVjdChWYXJpYWJsZSwgImNvbW1fb2ZmcGxhbiIpIH4gIkNvbW0gb2ZmcGxhbiIsCiAgICBzdHJfZGV0ZWN0KFZhcmlhYmxlLCAiY29tbV9yZWFkeSIpIH4gIkNvbW0gcmVhZHkiLAogICAgc3RyX2RldGVjdChWYXJpYWJsZSwgIkFFRCIpIH4gIkFFRCBleGNoYW5nZSByYXRlIiwKICAgIHN0cl9kZXRlY3QoVmFyaWFibGUsICJVU0RfIikgfiAiVVNEIENyeXB0byBleGNoYW5nZSByYXRlcyIsCiAgICBzdHJfZGV0ZWN0KFZhcmlhYmxlLCAic2FtZV9wdHlwZSIpIH4gIlNhbWUgcHJvcGVydHkgdHlwZSIsCiAgICBzdHJfZGV0ZWN0KFZhcmlhYmxlLCAiYXJlYSIpIH4gIkFyZWEiLAogICAgc3RyX2RldGVjdChWYXJpYWJsZSwgImZ1cm5pc2hlZCIpIH4gIkZ1cm5pc2hlZCIsCiAgICBzdHJfZGV0ZWN0KFZhcmlhYmxlLCAiYmF0aHMiKSB+ICJCYXRocyIsCiAgICBzdHJfZGV0ZWN0KFZhcmlhYmxlLCAiYmFsY29ueSIpIH4gIkJhbGNvbnkiLAogICAgc3RyX2RldGVjdChWYXJpYWJsZSwgInN3aW1taW5nX3Bvb2wiKSB+ICJTd2ltbWluZyBwb29sIiwKICAgIHN0cl9kZXRlY3QoVmFyaWFibGUsICJwYXJraW5nIikgfiAiUGFya2luZyIsCiAgICBzdHJfZGV0ZWN0KFZhcmlhYmxlLCAic2FtZV9iZWRzXyIpIH4gIlNhbWUgYmVkcyIsCiAgICBzdHJfZGV0ZWN0KFZhcmlhYmxlLCAic2FtZV9hcmVhXyIpIH4gIlNhbWUgYXJlYSIsCiAgICBzdHJfZGV0ZWN0KFZhcmlhYmxlLCAic2FtZV9hZGRyZXNzIikgfiAiU2FtZSBhZGRyZXNzIiwKICAgIHN0cl9kZXRlY3QoVmFyaWFibGUsICJtZXRybyIpIH4gIk1ldHJvIiwKICAgIHN0cl9kZXRlY3QoVmFyaWFibGUsICJtYXJrZXQiKSB+ICJNYXJrZXQiLAogICAgc3RyX2RldGVjdChWYXJpYWJsZSwgImhvc3BpdGFsIikgfiAiSG9zcGl0YWwiLAogICAgc3RyX2RldGVjdChWYXJpYWJsZSwgImNvbW11bml0eSIpIH4gIkNvbW11bml0eSIsCiAgICBzdHJfZGV0ZWN0KFZhcmlhYmxlLCAiKEludGVyY2VwdCkiKSB+ICIoSW50ZXJjZXB0KSIsCiAgICBUUlVFIH4gIk1pc2MiICMgRm9yIGFsbCBvdGhlciBjYXNlcwogICkpCmBgYAoKCmBgYHtyfQojIENvbGxhcHNlIHRoZSBkYXRhZnJhbWUgdG8gb25seSBrZWVwIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBlYWNoIHByZWZpeAojIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlcyBvZiBlYWNoIHR5cGUKY29lZl90YWJsZSRDb2VmZmljaWVudHMgPC0gYXMubnVtZXJpYyhjb2VmX3RhYmxlJENvZWZmaWNpZW50cykKY29sbGFwc2VkX2NvZWZfbWF0cml4IDwtIGNvZWZfdGFibGUgJT4lCiAgZ3JvdXBfYnkocHJlZml4KSAlPiUKICBzdW1tYXJpc2UoTWVhbiA9IG1lYW4oQ29lZmZpY2llbnRzKSwKICAgICAgICAgICAgTWluID0gbWluKENvZWZmaWNpZW50cyksCiAgICAgICAgICAgIE1heCA9IG1heChDb2VmZmljaWVudHMpLAogICAgICAgICAgICBDb3VudCA9IG4oKSkgJT4lCiAgbXV0YXRlKE1lYW4gPSByb3VuZChNZWFuLCAyKSwKICAgICAgICAgTWluID0gcm91bmQoTWluLCAyKSwKICAgICAgICAgTWF4ID0gcm91bmQoTWF4LCAyKSkgJT4lCiAgYXJyYW5nZShkZXNjKENvdW50KSkgICMgU29ydGluZyBieSBNYXggaW4gZGVzY2VuZGluZyBvcmRlcgoKCiMgVmlldyB0aGUgY29sbGFwc2VkIGRhdGFmcmFtZQpwcmludChjb2xsYXBzZWRfY29lZl9tYXRyaXgpCgojIE91dHB1dCB0byBMYXRleApvdXRwdXRfbGFzc29fMiA8LSAwCmlmIChvdXRwdXRfbGFzc29fMiA9PSAxKSB7CiAga2FibGUoY29sbGFwc2VkX2NvZWZfbWF0cml4LCBmb3JtYXQgPSAibGF0ZXgiLCBib29rdGFicyA9IFRSVUUsIGNhcHRpb24gPSAiTEFTU08gUmVncmVzc2lvbiByZXN1bHRzIiwgcm93Lm5hbWVzID0gRkFMU0UpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJjZW50ZXIiKSAlPiUKICBjb2x1bW5fc3BlYygxLCBib3JkZXJfcmlnaHQgPSBUUlVFKSAlPiUKICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICIyZW0iKSAlPiUKICByb3dfc3BlYygwLCBib2xkID0gVFJVRSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiM1NkI0RTkiKQp9CmBgYAoKCiMjIEludmVzdGlnYXRlIHBlcmNlbnRhZ2UgZXJyb3IKYGBge3J9CiMgQXZlcmFnZSBwZXJjZW50YWdlIGVycm9yIApwcmVkIDwtIHByZWRpY3QoZml0Lmxhc3NvLCBuZXd4ID0gYXMubWF0cml4KHhfdGVzdF9kZiksIHMgPSBmaXQubGFzc28kbGFtYmRhLm1pbiwgdHlwZSA9ICJyZXNwb25zZSIpCiAgCmlmIChsb2dfcHJpY2UpIHsKICAgIHByZWQgPC0gMTAqKnByZWQKICAgIHlfdGVzdCA8LSB5X3Rlc3Rfb3JpZwp9Cgpjb21wYXJlX2RmIDwtIGRhdGEuZnJhbWUoeV90ZXN0ID0geV90ZXN0LCBwcmVkaWN0aW9ucyA9IHByZWQpCmNvbXBhcmVfZGYkcGVyY19lcnJvciA8LSBhYnMoKGNvbXBhcmVfZGYkeV90ZXN0LWNvbXBhcmVfZGYkczEpL2NvbXBhcmVfZGYkeV90ZXN0KSoxMDAKY29tcGFyZV9kZiRlcnJvciA8LSBhYnMoY29tcGFyZV9kZiRzMSAtY29tcGFyZV9kZiR5X3Rlc3QpCgojIENhbGN1bGF0ZSB0aGUgZGVjaWxlcwpkZWNpbGVzIDwtIHF1YW50aWxlKGNvbXBhcmVfZGYkcGVyY19lcnJvciwgcHJvYnMgPSBzZXEoMCwgMSwgYnkgPSAwLjEpLCBuYS5ybSA9IFRSVUUpCnByaW50KGRlY2lsZXMpCmBgYAoKIyMgR3JhcGhzIApgYGB7cn0KIyBQcmVwYXJlIGRhdGEgZm9yIGdyYXBocyAKdGVzdF9ncmFwaCA8LSBkYXRhLmZyYW1lKHhfdGVzdF91bnNjYWxlZCkKdGVzdF9ncmFwaCRwZXJjX2Vycm9yIDwtIGNvbXBhcmVfZGYkcGVyY19lcnJvcgp0ZXN0X2dyYXBoJGVycm9yICA8LSBjb21wYXJlX2RmJGVycm9yCgp0ZXN0X2dyYXBoJHByaWNlIDwtIGNvbXBhcmVfZGYkeV90ZXN0CnRlc3RfZ3JhcGggCmBgYApgYGB7cn0KIyBHcmFwaCBhYnMgZXJyb3IKcGxvdF9hYnNfZXJyb3I8LSBnZ3Bsb3QodGVzdF9ncmFwaCwgYWVzKHggPSBwcmljZSwgeSA9IGVycm9yKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICcjMWY3N2I0JyAsc2l6ZSA9IDAuNSkgKyAgIyBTY2F0dGVyIHBsb3QgcG9pbnRzCiAgeGxhYigiUHJpY2UiKSArCiAgeWxhYigiQWJzb2x1dGUgRXJyb3IiKSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksICAjIEFkanVzdCB0aGUgZm9udCBzaXplIGhlcmUKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksICAjIEFkanVzdCB0aGUgdGl0bGUgZm9udCBzaXplCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpICsgICMgQWRqdXN0IHRoZSBheGlzIHRleHQgZm9udCBzaXplCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6Y29tbWEpIApwbG90X2Fic19lcnJvcgpgYGAKCgpgYGB7cn0KIyBHcmFwaCBwZXJjZW50YWdlIGVycm9yCnBsb3RfcGVyY19lcnJvcjwtIGdncGxvdCh0ZXN0X2dyYXBoLCBhZXMoeCA9IHByaWNlLCB5ID0gcGVyY19lcnJvcikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAnIzFmNzdiNCcgLHNpemUgPSAwLjUpICsgICMgU2NhdHRlciBwbG90IHBvaW50cwogIHhsYWIoIlByaWNlIikgKwogIHlsYWIoIlBlcmNlbnRhZ2UgRXJyb3IiKSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksICAjIEFkanVzdCB0aGUgZm9udCBzaXplIGhlcmUKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksICAjIEFkanVzdCB0aGUgdGl0bGUgZm9udCBzaXplCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpICsgICMgQWRqdXN0IHRoZSBheGlzIHRleHQgZm9udCBzaXplCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6Y29tbWEpIApwbG90X3BlcmNfZXJyb3IKYGBgCgpgYGB7cn0KIyBHcmFwaCBwcmVkaWN0aW9uIGVycm9yCgojUHJlcGFyZSBkYXRhCnRlc3RfZ3JhcGhfZHQgPC0gdGVzdF9ncmFwaCAlPiUgYXMuZGF0YS50YWJsZQoKdGVzdF9ncmFwaF9kdFssIGNvbW11bml0eSA6PSAnRHViYWkgTWFyaW5hJ10KCnRlc3RfZ3JhcGhfZHQ8LSB0ZXN0X2dyYXBoX2R0ICU+JQogIC5bY29tbXVuaXR5X0p1bWVpcmFoLkJlYWNoLlJlc2lkZW5jZS4uSkJSLj09VCwgY29tbXVuaXR5IDo9ICdKdW1laXJhaCBCZWFjaCBcbiBSZXNpZGVuY2UgKEpCUiknXSAlPiUKICAuW2NvbW11bml0eV9KdW1laXJhaC5MYWtlLlRvd2Vycy4uSkxULj09VCwgY29tbXVuaXR5IDo9ICdKdW1laXJhaCBMYWtlIFxuIFRvd2VycyAoSkxUKSddICU+JQogIC5bY29tbXVuaXR5X0p1bWVpcmFoLlZpbGxhZ2UuQ2lyY2xlLi5KVkMuPT1ULCBjb21tdW5pdHkgOj0gJ0p1bWVpcmFoIFZpbGxhZ2UgXG4gQ2lyY2xlIChKVkMpJ10KCgojIFByb2R1Y2UgcGxvdApwbG90X3BlcmNfZXJyb3JfY29tbXVuaXR5IDwtIGdncGxvdCh0ZXN0X2dyYXBoX2R0LCBhZXMoeT1jb21tdW5pdHksIHg9cGVyY19lcnJvciwgY29sb3I9Y29tbXVuaXR5KSkgKyAKICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IGNvbW11bml0eSwKICAgICAgICAgICAgICAgICAgZmlsbCA9IGFmdGVyX3NjYWxlKGNvbG9yc3BhY2U6OmxpZ2h0ZW4oZmlsbCwgLjIpKSksCiAgICAgICAgICAgICAgZHJhd19xdWFudGlsZXMgPSBjKDAuMDUsIDAuMjUsIDAuNSwgMC43NSwgMC45NSksCiAgICAgICAgICAgICAgc2l6ZSA9IDAuMiwgc2NhbGU9J3dpZHRoJywgY29sb3VyID0gImJsYWNrIikgKwogIHRoZW1lX21pbmltYWwoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLCAgIyBBZGp1c3QgdGhlIGZvbnQgc2l6ZSBoZXJlCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLCAgIyBBZGp1c3QgdGhlIHRpdGxlIGZvbnQgc2l6ZQogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAgIyBBZGp1c3QgdGhlIGF4aXMgdGV4dCBmb250IHNpemUKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjgpLAogICAgICAgIGF4aXMudGl0bGUueS5sZWZ0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgICAgICBheGlzLnRleHQueS5sZWZ0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTEyKSwKICAgICAgICBheGlzLnRpdGxlLnkucmlnaHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIHNpemU9MTQpLAogICAgICAgIGF4aXMudGV4dC55LnJpZ2h0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBzaXplPTE0KSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIpKSArICAjIEFkanVzdCB0aGUgYXhpcyB0aWNrcyBzaXplCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6Y29tbWEpICsKICBsYWJzKHk9JycsIHg9IlByZWRpY3Rpb24gRXJyb3IgKCUpIikgCnBsb3RfcGVyY19lcnJvcl9jb21tdW5pdHkKYGBgCgojIFNldHRpbmcgZyAKCgojIEJNUwoKYGBge3J9CiMgRml0IG1vZGVsCmZpdC5iYXllc3JlZyA8LSBtb2RlbFNlbGVjdGlvbihwcmljZSB+IC4sIGRhdGE9dHJhaW5fZGYsIHByaW9yQ29lZj16ZWxsbmVycHJpb3IodGF1c3RkID0gIDEpLCBwcmlvckRlbHRhPW1vZGVsYmJwcmlvcigxLDEpLCBuaXRlcj0zMDAwMCkKYGBgCgpgYGB7cn0KIyBDb252ZXJnZW5jZSBjaGVja3MgCm1hcmdwcGVzdD0gbWF0cml4KE5BLG5yb3c9bnJvdyhmaXQuYmF5ZXNyZWckcG9zdFNhbXBsZSksbmNvbD1uY29sKGZpdC5iYXllc3JlZyRwb3N0U2FtcGxlKSkKZm9yIChqIGluIDE6bmNvbChmaXQuYmF5ZXNyZWckcG9zdFNhbXBsZSkpIHsKICAgIG1hcmdwcGVzdFssal09IGN1bXN1bShmaXQuYmF5ZXNyZWckcG9zdFNhbXBsZVssal0pLygxOm5yb3coZml0LmJheWVzcmVnJHBvc3RTYW1wbGUpKQp9CgpwYXIobWFyPWMoNCw1LC4xLC4xKSwgY2V4LmxhYj0xLCBjZXguYXhpcz0xKQpwbG90KG1hcmdwcGVzdFssMV0sIHR5cGU9J2wnLCB5bGltPWMoMCwxKSwgeGxhYj0nR2liYnMgaXRlcmF0aW9uJywgeWxhYj0nRXN0aW1hdGVkIFAoZ2FtbWFfaj0xIHwgeSknKQpmb3IgKGogaW4gMjpuY29sKG1hcmdwcGVzdCkpIGxpbmVzKG1hcmdwcGVzdFssal0pCmBgYAoKCmBgYHtyfQpiYXllc19wcmVkPSBwcmVkaWN0KGZpdC5iYXllc3JlZywgZGF0YSA9IHhfdHJhaW5fZGYsIG5ld2RhdGEgPXhfdGVzdF9kZikKCiMgUk1TRQpybXNlX3ZhbHVlIDwtIHJtc2UoeV90ZXN0LCBiYXllc19wcmVkKQpwcmludChybXNlX3ZhbHVlKSAjIDIxMTQxMi4yCgojIENhbGN1bGF0ZSBNQVBFCm1hcGUgPC0gbWVhbihhYnMoKHlfdGVzdCAtIGJheWVzX3ByZWQpIC8geV90ZXN0KSkgKiAxMDAKcHJpbnQobWFwZSkKYGBgCgpgYGB7cn0KIyBQcmVwYXJlIGRhdGEgCnRlc3RfZ3JhcGgkYmF5ZXNfcHJlZF8yNSA8LSBiYXllc19wcmVkWywyXQp0ZXN0X2dyYXBoJGJheWVzX3ByZWRfOTc1IDwtIGJheWVzX3ByZWRbLDNdCnRlc3RfZ3JhcGgkYmF5ZXNfcHJlZCA8LSBiYXllc19wcmVkWywxXQp0ZXN0X2dyYXBoJHBlcmNfZXJyb3JfYmF5ZXMgPC0gYWJzKCh0ZXN0X2dyYXBoJHByaWNlIC0gdGVzdF9ncmFwaCRiYXllc19wcmVkKSAvIHRlc3RfZ3JhcGgkcHJpY2UpICogMTAwCnRlc3RfZ3JhcGgkcGVyY19lcnJvcl9iYXllcyA8LSAodGVzdF9ncmFwaCRwcmljZSAtIHRlc3RfZ3JhcGgkYmF5ZXNfcHJlZCkgCgojIE5ldyBjb2x1bW4gdG8gZGV0ZXJtaW5lIGNvbG9yCnRlc3RfZ3JhcGgkY29sb3IgPC0gaWZlbHNlKHRlc3RfZ3JhcGgkcHJpY2UgPiB0ZXN0X2dyYXBoJGJheWVzX3ByZWRfMjUgJiB0ZXN0X2dyYXBoJHByaWNlIDwgdGVzdF9ncmFwaCRiYXllc19wcmVkXzk3NSwgIiMxZjc3YjQiLCAicmVkIikKCiMgR3JhcGggcGVyY2VudGFnZSBlcnJvciBiYXllcyB3aXRoIGNvbG9yIGNvbmRpdGlvbgpwbG90X3BlcmNfZXJyb3JfYmF5ZXMgPC0gZ2dwbG90KHRlc3RfZ3JhcGgsIGFlcyh4ID0gcHJpY2UsIHkgPSBwZXJjX2Vycm9yX2JheWVzLCBjb2xvciA9IGNvbG9yKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgZ2VvbV9wb2ludChzaXplID0gMC41KSArICAjIFNjYXR0ZXIgcGxvdCBwb2ludHMKICB4bGFiKCJQcmljZSIpICsKICB5bGFiKCJQZXJjZW50YWdlIEVycm9yIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksICAjIEFkanVzdCB0aGUgZm9udCBzaXplIGhlcmUKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksICAjIEFkanVzdCB0aGUgdGl0bGUgZm9udCBzaXplCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpICsgICMgQWRqdXN0IHRoZSBheGlzIHRleHQgZm9udCBzaXplCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6Y29tbWEpICsKICBzY2FsZV9jb2xvcl9pZGVudGl0eSgpICAjIFVzZSB0aGUgYWN0dWFsIGNvbG9ycyBzcGVjaWZpZWQgaW4gdGhlIGRhdGEgZnJhbWUKCnBsb3RfcGVyY19lcnJvcl9iYXllcwpgYGAKCmBgYHtyfQpmcmVxX3RhYmxlX2NvbG91cjwtIHRhYmxlKHRlc3RfZ3JhcGgkY29sb3IpCmZyZXFfdGFibGVfY29sb3VyCmBgYAoKCgpgYGB7cn0KI1ByZXBhcmUgZGF0YQp0ZXN0X2dyYXBoX3NvcnRlZDwtIHRlc3RfZ3JhcGggJT4lIGFycmFuZ2UocHJpY2UpICU+JSBtdXRhdGUob2JzID0gc2VxKDE6bGVuZ3RoKHByaWNlKSkpCnRlc3RfZ3JhcGhfZHRfMiA8LSB0ZXN0X2dyYXBoX3NvcnRlZCAlPiUgYXMuZGF0YS50YWJsZQp0ZXN0X2dyYXBoX2R0XzJbLCBjb21tdW5pdHkgOj0gJ0R1YmFpIE1hcmluYSddCnRlc3RfZ3JhcGhfZHRfMjwtIHRlc3RfZ3JhcGhfZHRfMiAlPiUKICAuW2NvbW11bml0eV9KdW1laXJhaC5CZWFjaC5SZXNpZGVuY2UuLkpCUi49PVQsIGNvbW11bml0eSA6PSAnSnVtZWlyYWggQmVhY2ggXG4gUmVzaWRlbmNlIChKQlIpJ10gJT4lCiAgLltjb21tdW5pdHlfSnVtZWlyYWguTGFrZS5Ub3dlcnMuLkpMVC49PVQsIGNvbW11bml0eSA6PSAnSnVtZWlyYWggTGFrZSBcbiBUb3dlcnMgKEpMVCknXSAlPiUKICAuW2NvbW11bml0eV9KdW1laXJhaC5WaWxsYWdlLkNpcmNsZS4uSlZDLj09VCwgY29tbXVuaXR5IDo9ICdKdW1laXJhaCBWaWxsYWdlIFxuIENpcmNsZSAoSlZDKSddCgojIEFzc3VtaW5nICdjb21tdW5pdHknIGlzIHRoZSBjb2x1bW4gbmFtZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tdW5pdHkgaW5mb3JtYXRpb24KZmlsdGVyZWRfZGF0YSA8LSB0ZXN0X2dyYXBoX2R0XzIgJT4lIAogIGZpbHRlcihncmVwbCgiSlZDIiwgY29tbXVuaXR5KSkKCiMgRGVmaW5lIGNvbG9ycyBmb3IgYWN0dWFsIGFuZCBwcmVkaWN0aW9uIHBvaW50cwpjb2xvcnMgPC0gYygnYWN0dWFsJyA9ICdibHVlJywgJ3ByZWRpY3Rpb24nID0gJ3JlZCcpCgojIENyZWF0ZSB0aGUgcGxvdApnZ3Bsb3QoZmlsdGVyZWRfZGF0YSwgYWVzKHggPSBzZXFfYWxvbmcocHJpY2UpLCB5ID0gcHJpY2UpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gJ2FjdHVhbCcpLCBzaXplID0gMC4xKSArIAogIGdlb21fcG9pbnQoYWVzKHkgPSBiYXllc19wcmVkLCBjb2xvciA9ICdwcmVkaWN0aW9uJyksIHNpemUgPSAwLjEpICsgCiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gYmF5ZXNfcHJlZF8yNSwgeW1heCA9IGJheWVzX3ByZWRfOTc1KSwgd2lkdGggPSAwLjAxKSArIAogIGxhYnMoeCA9ICJPYnNlcnZhdGlvbiBudW1iZXIgKHJhbmtlZCkiLCAKICAgICAgIHkgPSAiUHJpY2UgYW5kIEJheWVzaWFuIFByZWRpY3Rpb24iLCAKICAgICAgIGNvbG9yID0gIkxlZ2VuZCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JzKSArIAogIGdndGl0bGUoJ0NyZWRpYmxlIEludGVydmFscyBmb3IgUHJlZGljdGlvbnMgd2l0aCBCTUEnKQpgYGAKCmBgYHtyfQpjb2VmKGZpdC5iYXllc3JlZykKYGBgCgpgYGB7cn0KY29lZihmaXQuYmF5ZXNyZWcpW29yZGVyKGNvZWYoZml0LmJheWVzcmVnKVssNF0sIGRlY3JlYXNpbmcgPSBUUlVFKSxdCmBgYAoKCg==